在Angular JS中,有没有办法在不使用scope.watch的情况下监视DOM的更改?

特立独行的

我正在尝试创建一个angularjs引导手风琴,该手风琴在打开时会将手风琴滚动到顶部。

这些解决方案接近我想要做的事情:

但是,它们使用超时或示波器监视。除非绝对必要,否则我想避免使用它们。

有没有一种无需使用$watch即可完成此操作的方法setTimeout

这是我正在尝试做的事情,使用$ watch:https : //plnkr.co/edit/XQpUdrdjqaCGom4L9yIJ

app.directive( 'scrollTop', scrollTop );

function scrollTop() {
    return {
        restrict: 'A',
        link: link
    };
}

function link( scope, element ) {
    scope.collapsing = false;
    var jqElement = $( element) ;
    scope.$watch( function() {
        return jqElement.find( '.panel-collapse' ).hasClass( 'collapsing' );
    }, function( status ) {
        if ( scope.collapsing && !status ) {
            if ( jqElement.hasClass( 'panel-open' ) ) {
                $( 'html,body' ).animate({
                    scrollTop: jqElement.offset().top - 30
                }, 500 );
            }
        }
        scope.collapsing = status;
    } );
}
特立独行的

我找到了一种从控制器执行此操作的方法。

我添加了一个被触发ng-click以报告is-open手风琴状态的功能。

使用组件生命周期挂钩,$doCheck我能够观察到状态的变化vm.isOpen$doCheck在每个摘要周期的末尾运行,因此我不需要设置a$scope.watch$timeOut

$doCheck本质上运行相同的代码作为问题的指令

app.controller('homeController', function($state, $element, sections, $transitions) {
  var vm = this;

  vm.$onInit = function() {
    vm.sections = sections.getSections();
  };

  function updateOpenStatus() {
    vm.collapsing = false;
    vm.isOpen = vm.sections.some(function(item) {
      return item.isOpen;
    });
  }

  vm.$doCheck = function() {
    if (vm.isOpen) {
      var elem = $element.find('.panel-collapse');
      var status = elem.hasClass('collapsing');
      if (vm.collapsing && !status) {
        var parentElem = elem.closest('.panel-open');
        if (elem.parent().hasClass('panel-open')) {
          $('html,body')
            .stop()
            .animate({
              scrollTop: parentElem.offset().top - 52
            }, 'fast');
        }
      }
      vm.collapsing = status;
    }
  };
});

我更新了uib-accordion以在控制器中调用函数

<uib-accordion>
  <div heading="Section Title" is-open="section.isOpen" ng-repeat="section in vm.sections" scroll-top uib-accordion-group>
    <uib-accordion-heading>
      <div ng-class="{isOpen: section.isOpen}" ng-click="vm.toggleOpen()">
        <h3>{{section.sectionTitle}}</h3>
      </div>
    </uib-accordion-heading>
    <div class="clearfix">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
      in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </div>
  </div>
</uib-accordion>

更新的Plnkr:https ://plnkr.co/edit/5EqDfmVOa0hzFfaQqdI0 ? p = preview

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Angular中有没有办法在不使用$ watch的情况下对模型更改做出反应?

有没有办法在不使用pairs()的情况下循环遍历一个数组?

有没有办法在不使用外部库的情况下删除C中字符串的所有前导和尾随空格?

有没有办法在不使用try()或tryCatch()的情况下在错误后继续R中的for循环

有没有办法在不使用void指针的情况下返回C函数中的任何类型?

有没有办法等待Angular中的DOM更新?

有没有办法在不使用python中的sort()的情况下对基于数字的数字进行排序?

有没有办法在不使用Haskell中的return的情况下实现此.csv阅读器?

有没有办法我可以在不使用图像的情况下指定收藏夹图标?

有没有办法在不扩展TabActivity或不使用片段的情况下,使标签具有独立的内容?

有没有办法防止在Angular 2 RC5中删除DOM?

在没有$ scope或$ watch的情况下跨Angular控制器访问函数

有没有办法在不使用 select APDU 命令的情况下选择 javacard 小程序?

有没有办法在不使用 PrintManager.print 的情况下插入打印作业?

有没有办法在不使用 Flutter 中的 Mock 类扩展的情况下模拟对象?

有没有办法在不使用 HTML/CSS 元素的情况下跟踪 Selenium 中的上传进度?

有没有办法在没有 HTML/用户输入的情况下从 Angular 的本地网络中检索 CSV 文件

有没有办法在不使用插座的情况下更新 NSTextField 标签的 stringValue ?

Angular,有没有办法在没有表单的情况下“markAsTouched”一个字段?

有没有办法在不使用输入文件的情况下上传文件

有没有办法在不使用递归的情况下获取参数包中的值?

有没有办法在不使用 sudo 的情况下切换 Xcode 版本?

有没有办法在不使用 CTE 的情况下进行递归 SQL 查询?

有没有办法在不使用双向绑定的情况下在 blazor 中创建只读日期框?

有没有办法在不使用 if-else if 的情况下获得选定的组合

有没有办法在不使用变量的情况下在 vanilla Javascript 中定义 HTML ID?

有没有办法在不使用书签的情况下清除 PBI 报告上的过滤器

Angular Material 对话框:有没有办法在模板中不使用 data 属性作为“data.*”?

有没有办法在不使用循环的情况下使用系列索引列表?