javascript - Angular.js 将过滤器传递给指令双向 ('=' ) 属性

标签 javascript angularjs angularjs-directive angularjs-ng-repeat angularjs-filter

我需要在页面的几个地方使用 sublist 指令,它有时应该包含完整的 fields 列表,但有时会被过滤。这是我天真的方法:

HTML:

  <div ng-controller="MainCtrl">
      <sublist fields="fields" /> <!-- This one is OK -->
      <sublist fields="fields | filter: 'Rumba'" /> <!-- This one raises error -->
  </div>

Javascript:

angular.module('myApp', [])
    .directive('sublist', function () {
        return {
            restrict: 'E',
            scope: { fields: '=' },
            template: '<div ng-repeat="f in fields">{{f}}</div>'
        };
    })
    .controller('MainCtrl', function($scope) {
        $scope.fields = ['Samba', 'Rumba', 'Cha cha cha'];
    });

http://jsfiddle.net/GDfxd/14/

当我尝试使用过滤器时出现此错误:

Error: 10 $digest() iterations reached. Aborting!

这个问题有解决方案吗?

最佳答案

$digest iterations 错误通常发生在观察者更改模型时。在错误情况下,隔离 fields 绑定(bind)绑定(bind)到过滤器的结果。该绑定(bind)创建了一个观察者。由于过滤器每次运行时都会从函数调用中返回一个新对象,因此它会导致观察器不断触发,因为旧值永远不会匹配新值(参见 this comment from Igor in Google Groups )。

一个好的解决方法是在这两种情况下绑定(bind) fields,例如:

<sublist fields="fields" /></sublist>

并为第二种情况添加另一个可选属性用于过滤:

<sublist fields="fields" filter-by="'Rumba'" /></sublist>

然后像这样调整你的指令:

return {
    restrict: 'E',
    scope: {
        fields: '=',
        filterBy: '='
    },
    template: '<div ng-repeat="f in fields | filter:filterBy">'+
              '<small>here i am:</small> {{f}}</div>'
};

注意:请记住关闭您的 fiddle 中的 sublist 标签。

Here is a fiddle

关于javascript - Angular.js 将过滤器传递给指令双向 ('=' ) 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17198500/

相关文章:

javascript - 未捕获的语法错误 : Unexpected reserved word

javascript - 在 angularJS 中使用 ng-if 条件停止循环

javascript - Angular 加载和 $digest

javascript - child 里面 Angular child

javascript - 按下按钮时触发点击事件

javascript - 如何停止 ui-sref 编码 url 参数

javascript - 如何使用 addEventListener 获取用户点击坐标,然后使用 elementFromPoint().click() 重复该点击?

javascript - 迭代对象并访问其属性

javascript - 使用 Javascript 删除表中除第一个以外的所有行

javascript - ng-repeat 中的 Angularjs 指令不更新外部 Controller 数据