我有这个过滤器:
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,我怎样才能使过滤器工作一次?
答案 0 :(得分:1)
您可以使用contract in ::details.contracts | filter:{ ClientId:details.client.Id }
。这将评估整个表达式一次(好的,不是一次,直到它被定义)。但是当details.contracts
发生变化时,它也不会更新表达式。
答案 1 :(得分:1)
执行过滤器时
在模板中,过滤器仅在输入已更改时执行。这比在每个$ 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()">