我需要sublist在页面的几个地方使用指令,它有时应包含完整fields列表,但有时应进行过滤。这是我的幼稚方法:
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!
有解决此问题的方法吗?
在 $消化迭代 错误通常发生在有改变模型中的守望者。在错误情况下,隔离fields绑定将绑定到过滤器的结果。该绑定创建了一个观察者。由于过滤器每次运行时都会从函数调用中返回一个新对象,因此它会导致观察者不断触发,因为旧值永远不会与新值匹配(请参阅Google Groups中Igor的注释)。
一个好的解决办法是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>' };
注意:切记sublist在小提琴中关闭标签。
这是一个小提琴