Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ng重复的意外行为_Javascript_Angularjs - Fatal编程技术网

Javascript ng重复的意外行为

Javascript ng重复的意外行为,javascript,angularjs,Javascript,Angularjs,我有一个Angular(1.2.1)应用程序,带有ng repeat,看起来像: <div ng-repeat="item in list | filter:filterList | orderBy:orderList" my-dir> orderList看起来像: $scope.filterList = function(x){ if (Service.active()){ //tells me whether I need to filter by this fiel

我有一个Angular(1.2.1)应用程序,带有ng repeat,看起来像:

<div ng-repeat="item in list | filter:filterList | orderBy:orderList" my-dir>
orderList看起来像:

$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;
} 
$scope.orderList = function(x){
     return (x.value);
}
我看到的意外行为是,当Service.foo()和/或Service.field()更改时,我希望列表的内容会更改。事实上,它们确实如此——与新值匹配的项目出现在我列表的顶部,按
排序,正如预期的那样。但是,以前在列表中并且应该被删除的项目将以相同、正确的
值排序顺序保留在列表中,位于应该在列表中的项目下方

要澄清:如果
Service.field()=“a”
且列表包含对象:

field = 'a' value='3'
field = 'a' value='2'
field = 'a' value='1'
然后将“Service.field()”更改为
'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
only不查看字段,只查看值

究竟是什么原因导致了这种情况?

更新:我忘了提到filter函数中的console.log()语句对我不希望出现在列表中的项目进行打印-因此filter函数返回false,但这些项目没有被删除


更新#2:哇。因此,我突然想到,可能是一个异常被抛出并吞没在过滤器函数中,导致了这种行为。因此,我在它的顶行抛出了一个
I=3/0
,果然,没有向控制台抛出异常。我现在正在调查。但是请记住:错误已经修复重复,加上一个过滤器功能,现在显然已被破坏,工作正常。我怀疑这是一个关于我的问题是什么的强有力的线索,但我还没有弄清楚这条线索指向什么

如果使用
ng repeat
将数据绑定到
list
,则不会更改list对象,因此不会调用filter函数

您应该从其他地方更新列表数据,因此,反复检查并更新列表数据,如:

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中重复,使用该标记确定是否显示

<div ng-repeat="item in list | filter: {isShow: true} | orderBy:orderList" my-dir>


2个其他相同的if?这是打字错误吗?的确是这样,@Brian-谢谢你指出,
Service.foo()
Service.field()
更改时返回相同的值吗?@zsong:是的,我是。请参阅更新以获得澄清。这是不真实的。正如print语句所确认的,filter函数在我期望的时候被调用