ng-repeat 调用控制器函数太多次
ng-repeat call controller function too many times
我有下一个代码(事件是数组):
<tr ng-repeat="event in events">
<td>
<span time-ago="{{event.TimestampSec}}"></span>
</td>
<td>
{{prepareAlertValue(event.AlertValue)}}
</td>
</tr>
很久以前 - 我的自定义指令。它被执行events.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 一直在执行。
我需要为每个格式化程序函数编写指令吗?
Angular 不知道 prepareAlertValue() 内部发生了什么,所以
它需要在每个摘要
上调用这个函数
callPrepareAlertValueCount
是 window 上的全局变量,每当调用 prepareAlertValue
函数时都会更新。
要点是,每当发生摘要循环时都会调用它。每当进行更改时,例如触发点击事件(通过 Angular 和 ng-click
),或者更改 events
数组,都会触发 $digest 循环。当 $digest 被触发时,函数重新计算所有 angular 观察者正在重新计算,并递增 callPrepareAlertValueCount
。所以它发生的次数比 events.length
多很多。
基本上,您不应该依赖于以这种方式保持计数器,因为您无法控制 $digest 循环的次数 运行。
这里有一个简单的 Fiddle 来演示这一点。
这是正确的,无论您在 html 上绑定什么,它都会在每个摘要周期 运行 被 angular js 调用。
使用 {{::prepareAlertValue(event.AlertValue)}}
绑定一次指令,该指令将只执行一次该函数。
Note Bind Once only work for above Angular 1.3+
您可以停止在 ng-repeat 中调用控制器函数。或者如果你想在循环中调用控制器函数(ng-repeat),然后使用适当的条件(在你的控制器中),如果为真则调用函数如果你不这样做,那么它将每次调用控制器函数.
我有下一个代码(事件是数组):
<tr ng-repeat="event in events">
<td>
<span time-ago="{{event.TimestampSec}}"></span>
</td>
<td>
{{prepareAlertValue(event.AlertValue)}}
</td>
</tr>
很久以前 - 我的自定义指令。它被执行events.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 一直在执行。 我需要为每个格式化程序函数编写指令吗?
Angular 不知道 prepareAlertValue() 内部发生了什么,所以 它需要在每个摘要
上调用这个函数callPrepareAlertValueCount
是 window 上的全局变量,每当调用 prepareAlertValue
函数时都会更新。
要点是,每当发生摘要循环时都会调用它。每当进行更改时,例如触发点击事件(通过 Angular 和 ng-click
),或者更改 events
数组,都会触发 $digest 循环。当 $digest 被触发时,函数重新计算所有 angular 观察者正在重新计算,并递增 callPrepareAlertValueCount
。所以它发生的次数比 events.length
多很多。
基本上,您不应该依赖于以这种方式保持计数器,因为您无法控制 $digest 循环的次数 运行。
这里有一个简单的 Fiddle 来演示这一点。
这是正确的,无论您在 html 上绑定什么,它都会在每个摘要周期 运行 被 angular js 调用。
使用 {{::prepareAlertValue(event.AlertValue)}}
绑定一次指令,该指令将只执行一次该函数。
Note Bind Once only work for above Angular 1.3+
您可以停止在 ng-repeat 中调用控制器函数。或者如果你想在循环中调用控制器函数(ng-repeat),然后使用适当的条件(在你的控制器中),如果为真则调用函数如果你不这样做,那么它将每次调用控制器函数.