使用 angular $filter 服务就地过滤列表
Filter a list in-place with the angular $filter service
我有几个过滤器工作正常,到目前为止我只通过我的 HTML 模板中的管道使用它们。现在,我有一个用例,我想在指令的控制器中进行相同类型的过滤。
我知道我可以使用 angular $filter
服务访问过滤器,使用
var filtered = $filter('myFilter')(unfiltered);
但我的用例要求列表被过滤就地,即我不能重新绑定变量(以免我会松开绑定到其他地方可能会使用相同的变量)。
我在 the official docs 中找不到任何相关信息,但我还不想放弃希望 =)
我认为您描述的是替换子作用域中的整个数组(或对象)、父作用域或兄弟作用域失去与数组的连接的情况。发生这种情况是因为范围继承的性质。如果你有一个作用域,你在那个作用域上放置一个数组,然后有两个子作用域,并替换其中一个上的数组,那么另一个子作用域和父作用域将 'loose the connection'。
有几种方法可以解决这个问题。这里有一对:
- 用父作用域中的对象包装数组。然后通过对象引用子作用域中的数组。如果这样做,您可以更改整个数组,所有控制器仍将引用相同的数组。
而不是:$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 处理原始数组,并且在所有范围内对数组的引用保持不变。
我有几个过滤器工作正常,到目前为止我只通过我的 HTML 模板中的管道使用它们。现在,我有一个用例,我想在指令的控制器中进行相同类型的过滤。
我知道我可以使用 angular $filter
服务访问过滤器,使用
var filtered = $filter('myFilter')(unfiltered);
但我的用例要求列表被过滤就地,即我不能重新绑定变量(以免我会松开绑定到其他地方可能会使用相同的变量)。
我在 the official docs 中找不到任何相关信息,但我还不想放弃希望 =)
我认为您描述的是替换子作用域中的整个数组(或对象)、父作用域或兄弟作用域失去与数组的连接的情况。发生这种情况是因为范围继承的性质。如果你有一个作用域,你在那个作用域上放置一个数组,然后有两个子作用域,并替换其中一个上的数组,那么另一个子作用域和父作用域将 'loose the connection'。 有几种方法可以解决这个问题。这里有一对:
- 用父作用域中的对象包装数组。然后通过对象引用子作用域中的数组。如果这样做,您可以更改整个数组,所有控制器仍将引用相同的数组。
而不是:$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 处理原始数组,并且在所有范围内对数组的引用保持不变。