我有下一个代码(事件是数组):
<tr ng-repeat="event in events">
<td>
<span time-ago="{{event.TimestampSec}}"></span>
</td>
<td>
{{prepareAlertValue(event.AlertValue)}}
</td>
</tr>
很久以前-我的自定义指令。它执行个事件。length次。
我的控制器:
...
window.callPrepareAlertValueCount = 0
$scope.prepareAlertValue = function(value) {
window.callPrepareAlertValueCount++;
if(safemineHelper.isFloat(value)) {
value = (~~(value * 100)) / 100;
}
return value;
}
...
列表显示后,我看到callPrepareAlertValueCount增长。控制台日志:
> callPrepareAlertValueCount
< 41890
> callPrepareAlertValueCount
< 46150
> callPrepareAlertValueCount
< 480315
请有人解释一下为什么一直执行prepareAlertValue。我需要为每个格式化程序函数编写指令吗?
这是正确的,无论你在html上绑定什么,它都会在angular js运行的每个摘要循环中被调用。
使用{{::prepareAlertValue(event.AlertValue)}}
绑定一次指令,该指令将只执行该函数一次。
注意绑定一次仅适用于Angular 1.3+以上
callPrepareAlertValueCount
是窗口上的全局变量,每当调用prepareAlertValue
函数时都会更新。
问题是,每当消化周期发生时,它就会被调用。无论何时进行更改,例如触发点击事件(通过Angular with ng-click
),或更改events
数组,都会触发$digest循环。当触发$digest时,函数会在重新评估所有角度观察者时重新评估,并递增callPrepareAlertValueCount
。因此,它发生的次数比events.length
多得多。
基本上,您不应该依赖于以这种方式保持计数器,因为您无法控制$digest循环的运行次数。
下面是一个简单的Fiddle演示。
您可以停止在ng repeat中调用控制器函数。或者,如果你想在循环中调用控制器函数(ng repeat),那么(在你的控制器中)使用适当的条件,如果为true,那么如果你不调用该函数,那么它每次都会调用控制器函数。