在使用 AngularJS 观察过滤集合的变化时,我遇到了一个有趣的问题。
我的范围内有一组项目,这些项目使用其属性之一进行过滤并使用以下方式呈现ng-repeat
:
<input ng-model="searchName" placeholder="search"/>
<ul>
<li ng-repeat="i in (filteredItems = (items | filter:searchName))">
{{i.name}}
</li>
</ul>
我想查看对 的更改filteredItems
,以便我可以更新取决于当前可见项目的范围变量。对于此示例,假设我想更新一个保持当前filteredItems
长度的变量并将其显示给用户:
<p>filtered items length: {{filteredItemsLen}}</p>
我在我的控制器中注册了一个监听filteredItems
器:
$scope.$watch('filteredItems', function(newItems, oldItems) {
$scope.filteredItemsLen = newItems.length;
}, true);
然而,在对 进行更改时并不总是调用此侦听器filteredItems
。在下面的小提琴中,请尝试以下操作:
- 将“aa”放入过滤器输入:显示的列表得到更新,没有调用监听器,所以显示的长度是错误的。
- 将“aaa”放入过滤器输入:显示的列表被更新,监听器被调用两次(首先使用来自前一个过滤器的数据,然后使用当前数据),显示的长度是正确的。
这是小提琴。请查看控制台日志以了解实际调用侦听器的时间。
有趣的观察:如果我{{filteredItems}}
在页面上的某个地方使用,那么侦听器会被正确调用。
我对 AngularJS 有什么不明白的地方吗?有任何想法吗?