Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.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 使用angular$Filter服务就地筛选列表_Javascript_Angularjs_Filter - Fatal编程技术网

Javascript 使用angular$Filter服务就地筛选列表

Javascript 使用angular$Filter服务就地筛选列表,javascript,angularjs,filter,Javascript,Angularjs,Filter,我有几个过滤器工作得很好,到目前为止,我只通过HTML模板中的管道使用它们。现在,我有一个用例,我想在指令的控制器中进行同样的过滤 我知道我可以使用angular$filter服务访问过滤器,使用 var filtered = $filter('myFilter')(unfiltered); 但是我的用例要求列表被适当地过滤,也就是说,我不能重新绑定变量(以免我会丢失对可能使用相同变量的其他位置的绑定) 我在中找不到关于这方面的任何信息,但我不想现在就放弃希望=)我认为您描述的是这样一种情况,

我有几个过滤器工作得很好,到目前为止,我只通过HTML模板中的管道使用它们。现在,我有一个用例,我想在指令的控制器中进行同样的过滤

我知道我可以使用angular
$filter
服务访问过滤器,使用

var filtered = $filter('myFilter')(unfiltered);
但是我的用例要求列表被适当地过滤,也就是说,我不能重新绑定变量(以免我会丢失对可能使用相同变量的其他位置的绑定)


我在中找不到关于这方面的任何信息,但我不想现在就放弃希望=)

我认为您描述的是这样一种情况,即替换子作用域中的整个数组(或对象),父作用域或同级作用域将失去与数组的连接。这是因为作用域继承的性质。如果您有一个作用域,则在该作用域上放置一个数组,然后有两个子作用域,并替换其中一个作用域上的数组,那么另一个子作用域和父作用域将“断开连接”。 有几种方法可以解决这个问题。以下是几点:

  • 使用父作用域上的对象包装数组。然后通过对象引用子作用域中的数组。如果这样做,则可以更改整个阵列,并且所有控制器仍将引用同一阵列
  • 而不是:$scope.someArr

    use: $scope.wrapper = {
       someArr: SomeArr
    }
    
    然后:在子范围引用上:$childScope.wrapper.someArr

  • 可以修改原始数组。筛选到新数组中,然后将参数合并到数组中,然后应用拼接:
  • 示例代码:

    //originalArr
    var newArr// = new filtered array
    var args = [0, originalArr.length].concat(newArr);
    originalArr.splice.apply(this, args);
    

    此代码仅为概念性代码,尚未经过测试。其思想是,splice处理原始数组,所有作用域上对数组的引用保持不变。

    这是一种非常非角度的处理方式。如果您讨论的是单个作用域上的绑定,只需重新绑定它。如果在作用域之间共享,请使用服务。为什么不能重新绑定该值?为什么不能从未筛选中删除所有内容,然后将所有内容从筛选中添加到未筛选中?真的不清楚更高级别的问题是什么。关于绑定问题的更多细节会有帮助,如果你丢失了一些绑定,那么你还有另一个问题,imho。这是两个很好的建议,其中一个肯定会解决我的问题。事实证明,我们现在必须以不同的方式解决这个问题,所以我还没有机会对它进行适当的测试,但是因为它看起来至少第二个版本,或者它的一些修改,应该可以完成这项工作,所以我将此标记为已接受。谢谢我又一次偶然发现这个问题,并且能够用第二种方法解决它;但是,我必须将代码更改为
    Array.prototype.splice.apply(originalArr[0,originalArr.length].concat(newArr))
    才能使其正常工作。