使用角度$ filter服务就地过滤列表

时间:2015-01-27 14:57:23

标签: javascript angularjs filter

我有一些工作正常的过滤器,到目前为止我只使用HTML模板中的管道。现在,我有一个用例,我想做同样的过滤,但是在指令的控制器中。

我知道我可以使用角度$filter服务来使用

来访问过滤器
var filtered = $filter('myFilter')(unfiltered);

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

我在the official docs找不到任何相关内容,但我不想放弃希望=)

1 个答案:

答案 0 :(得分:2)

我认为您正在描述一种情况,即替换子范围中的整个数组(或对象),父范围或兄弟范围会丢失与该数组的连接。这是因为范围继承的性质。如果您有一个范围,则在该范围上放置一个数组,然后有两个子范围,并在其中一个范围内替换该数组,然后另一个子范围和父范围将“松开连接”。 有几种方法可以解决这个问题。这是一对夫妇:

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

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

    然后:在子范围引用上:$ childScope.wrapper.someArr

    1. 您可以修改原始数组。过滤到一个新数组,然后将参数连接到一个数组,并应用splice:
    2. 示例代码:

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

      此代码仅供参考,尚未经过测试。我们的想法是splice处理原始数组,并且对所有作用域上的数组的引用保持不变。