如何使angularjs过滤器只工作一次?

时间:2016-08-30 17:20:21

标签: angularjs

我有这个过滤器:

filter:{ ClientId:details.client.Id }

这是我如何使用它:

  <uib-accordion-group ng-repeat="contract in details.contracts | filter:{ ClientId:details.client.Id } " is-open="false">
            <uib-accordion-heading>
                <div class="text-center">
                </div>
            </uib-accordion-heading>
            <div class="form-group">
                bla bla
            </div>
        </uib-accordion-group>
</uib-accordion>

如果创建了uib-accordion derective,我怎样才能使过滤器工作一次?

2 个答案:

答案 0 :(得分:1)

您可以使用contract in ::details.contracts | filter:{ ClientId:details.client.Id }。这将评估整个表达式一次(好的,不是一次,直到它被定义)。但是当details.contracts发生变化时,它也不会更新表达式。

答案 1 :(得分:1)

根据documentation

  

执行过滤器时

     

在模板中,过滤器仅在输入已更改时执行。这比在每个$ digest上执行过滤器更有效,就像表达式一样。

     

此规则有两个例外:

     

通常,这仅适用于将原始值作为输入的过滤器。接收对象作为输入的过滤器将在每个$ digest上执行,因为如果输入已经更改,跟踪过于昂贵。

     

标记为$ stateful的过滤器也会在每个$ digest上执行。有关详细信息,请参阅状态过滤器。请注意,没有Angular核心过滤器是$ stateful。

因此,在您的情况下,只要details.client.Id未从某个输入的更改事件触发或未触发摘要,您的过滤器就会以尽可能高的速度运行是。

另一种方法是调用具有缓存值的控制器方法。它不会阻止过滤器触发,但会立即返回缓存值。我不推荐这个,因为角度过滤器通常是高性能过滤解决方案的处方解决方案。

控制器方法

$scope.getCached = function(){
    if(cachedValue) return cachedValue
    return cachedValue = ...
}

<强>实施

<div ng-repeat="obj in objs | filter:getCached()">