Javascript 使用angular$Filter服务就地筛选列表
我有几个过滤器工作得很好,到目前为止,我只通过HTML模板中的管道使用它们。现在,我有一个用例,我想在指令的控制器中进行同样的过滤 我知道我可以使用angularJavascript 使用angular$Filter服务就地筛选列表,javascript,angularjs,filter,Javascript,Angularjs,Filter,我有几个过滤器工作得很好,到目前为止,我只通过HTML模板中的管道使用它们。现在,我有一个用例,我想在指令的控制器中进行同样的过滤 我知道我可以使用angular$filter服务访问过滤器,使用 var filtered = $filter('myFilter')(unfiltered); 但是我的用例要求列表被适当地过滤,也就是说,我不能重新绑定变量(以免我会丢失对可能使用相同变量的其他位置的绑定) 我在中找不到关于这方面的任何信息,但我不想现在就放弃希望=)我认为您描述的是这样一种情况,
$filter
服务访问过滤器,使用
var filtered = $filter('myFilter')(unfiltered);
但是我的用例要求列表被适当地过滤,也就是说,我不能重新绑定变量(以免我会丢失对可能使用相同变量的其他位置的绑定)
我在中找不到关于这方面的任何信息,但我不想现在就放弃希望=)我认为您描述的是这样一种情况,即替换子作用域中的整个数组(或对象),父作用域或同级作用域将失去与数组的连接。这是因为作用域继承的性质。如果您有一个作用域,则在该作用域上放置一个数组,然后有两个子作用域,并替换其中一个作用域上的数组,那么另一个子作用域和父作用域将“断开连接”。 有几种方法可以解决这个问题。以下是几点:
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))
才能使其正常工作。