使用 角度$filter服务就地筛选列表

Filter a list in-place with the angular $filter service

本文关键字:筛选 列表 服务 角度 filter 使用      更新时间:2023-09-26

我有几个过滤器工作正常,到目前为止,我只通过HTML模板中的管道使用。现在,我有一个用例,我想在指令的控制器中进行相同类型的过滤。

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

var filtered = $filter('myFilter')(unfiltered);

但是我的用例要求就过滤列表,即我无法重新绑定变量(以免我将绑定松散到可能使用相同变量的其他地方)。

我在官方文档中找不到任何关于此的内容,但我还不想放弃希望=)

我认为您正在描述一种情况,即替换子作用域、父级或同级作用域中的整个数组(或对象)会丢失与数组的连接。发生这种情况是由于范围继承的性质。如果你有一个作用域,你把一个数组放在该作用域上,然后有两个子作用域,并替换其中一个子作用域上的数组,那么另一个子作用域和父作用域将"失去连接"。有几种方法可以解决这个问题。这里有一对:

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

而不是:$scope.someArr

use: $scope.wrapper = {
   someArr: SomeArr
}

then:在子作用域引用上:$childScope.wrapper.someArr

  1. 您可以修改原始数组。过滤到一个新数组中,然后将参数连接到一个数组中,并应用拼接:

示例代码:

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

此代码仅是概念性的,尚未经过测试。这个想法是拼接处理原始数组,并且所有作用域上对数组的引用保持不变。