我正在使用Angular,而我尝试做的是将过滤后的集合传递给指令。
我的观点如下:
<h1>Filtered Collection (no directive)</h1>
<ul>
<li ng-repeat="person in filteredPeople = (people | filter: { isChecked: true })">
{{ person.name }}
</li>
</ul>
我传递的数据只是一个简单的对象数组:
$scope.people = [
{
name: "George",
isChecked: false
},
{
name: "Jane",
isChecked: false
},
{
name: "Peter",
isChecked: true
}
];
到目前为止一切正常。但是,当我尝试将HTML放在指令中时,应用程序崩溃了。
指令:
myApp.directive('filterPeople', function () {
return {
restrict: 'A',
template: '<h1>Filtered Collection (directive)</h1>' +
'<ul>' +
'<li ng-repeat="item in collection">{{ item.name }}</li>' +
'</ul>',
scope: {
collection: '=collection'
}
}
});
查看:
<div filter-people collection="filteredPeople"></div>
我得到的错误:
Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations
P.S。 我已经在Plunker上传了我的例子,一切似乎都在那里工作。我已经检查过我的应用中的代码是否相同而且确实如此。那么,为什么会这样呢?我的代码在Plunker上运行但不在我的真实应用中。
答案 0 :(得分:1)
你实际上并没有在指令中过滤;您将过滤后的数据从filterPeople语句传递到指令进行显示。应用程序崩溃,因为你有一个ng-repeat影响另一个ng-repeat的输出导致无限循环(Angular在10次递归后杀死循环)
Plunkr在这里显示了解决此问题的正确方法。只需将过滤器插入指令即可。
http://plnkr.co/edit/avjr306MESGE8xE6yN1M?p=preview
myApp.directive('filterPeople', function() {
return {
restrict: 'A',
template: '<h1>Filtered Collection (directive)</h1>' +
'<ul>' +
'<li ng-repeat="item in collection | filter: { isChecked: true }">{{ item.name }}</li>' +
'</ul>',
scope: {
collection: '=collection'
}
}
});