我有一个带有ng-repeat的Angular(1.2.1)应用程序,如下所示:
<div ng-repeat="item in list | filter:filterList | orderBy:orderList" my-dir>
其中filterList
类似于:
$scope.filterList = function(x){
if (Service.active()){ //tells me whether I need to filter by this field at all
if (x.field != Service.field()) {
console.log('FALSE:' + x.id)
return false;
}
}
else {...}
//other clauses like above
return true;
}
和orderList看起来像:
$scope.orderList = function(x){
return (x.value);
}
我看到的意外行为是,当Service.foo()和/或Service.field()发生变化时,我希望列表中的内容发生变化。确实如此 - 匹配新值的项目显示在我的列表顶部,按value
排序,如预期的那样。但是,以前应该已删除的列表中的项目应该已删除,而是保留在列表中,以相同,正确的value
- 排序顺序,位于应该位于的项目下方列表。
澄清:如果Service.field() == 'a'
且列表包含对象:
field = 'a' value='3'
field = 'a' value='2'
field = 'a' value='1'
然后&#39; Service.field()&#39;更改为'b'
,我希望看到
field = 'b' value='3'
field = 'b' value='2'
field = 'b' value='1'
//nothing else
但我看到了:
field = 'b' value='3'
field = 'b' value='2'
field = 'b' value='1'
field = 'a' value='3'
field = 'a' value='2'
field = 'a' value='1'
会认为服务中的更改未应用于范围是一个问题 - 但是a)我确保更新范围; b)如果是这种情况,清单将是:
field = 'a' value='3'
field = 'b' value='3'
field = 'a' value='2'
field = 'b' value='2'
field = 'a' value='1'
field = 'b' value='1'
因为orderList
只是不查看字段,只查看值。
地球上有什么可能导致这种情况?
更新:我忘了提到过滤函数中的console.log()语句打印我不希望列在列表中的项目 - 所以过滤函数返回false,但不删除项目。
更新#2:哇。因此,我想到可能在过滤器函数中抛出并吞下异常并导致此行为。所以,我在它的顶行扔了一个i = 3/0
,果然,没有异常被抛到控制台。我现在正在研究这个问题。但是得到这个: 错误已修复! 重复,过滤功能现在明显被破坏,按预期工作。我怀疑这是关于我的问题的一个强有力的线索,但我还没弄清楚线索指向的是什么。
答案 0 :(得分:0)
ng-repeat
绑定数据list
,列表对象不会更改,因此不会调用过滤器函数。
您应该从其他地方更新列表数据,因此,请重复检查和更新列表数据,例如:
var checkList = function() {
$scope.list.forEach(function(data) {
if (Service.foo()) {data.isShow = true;} // set a mark to display or not
});
}
$timeout(checkList, 5000); // check every 5 seconds.
然后在ng-repeat中,使用该标记确定是否显示。
<div ng-repeat="item in list | filter: {isShow: true} | orderBy:orderList" my-dir>