ng-repeat的意外行为

时间:2015-03-27 02:25:21

标签: javascript angularjs

我有一个带有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,果然,没有异常被抛到控制台。我现在正在研究这个问题。但是得到这个: 错误已修复! 重复,过滤功能现在明显被破坏,按预期工作。我怀疑这是关于我的问题的一个强有力的线索,但我还没弄清楚线索指向的是什么。

1 个答案:

答案 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>