3

I have next code (events is array):

<tr ng-repeat="event in events">
    <td>
        <span time-ago="{{event.TimestampSec}}"></span>
    </td>
    <td>
        {{prepareAlertValue(event.AlertValue)}}
    </td>
</tr>

time-ago - my custom directive. It is executed events.length times.

My controller:

...
window.callPrepareAlertValueCount = 0

$scope.prepareAlertValue = function(value) {
    window.callPrepareAlertValueCount++;
    if(safemineHelper.isFloat(value)) {
        value = (~~(value * 100)) / 100;
    }
    return value;
}
...

After list is shown - I see that callPrepareAlertValueCount grows. Console log:

 > callPrepareAlertValueCount
 < 41890
 > callPrepareAlertValueCount
 < 46150
 > callPrepareAlertValueCount
 < 480315

Please, can someone explain why is prepareAlertValue executed all time. Do I need to write directives for each formatter function?

4

4 回答 4

2

这是正确的,无论您在 html 上绑定什么,它都会在 angular js 运行的每个摘要循环中被调用。

使用{{::prepareAlertValue(event.AlertValue)}}只执行一次该函数的 bind once 指令。

注意绑定一次仅适用于以上 Angular 1.3+

于 2015-02-27T19:03:42.750 回答
1

Angular 不知道 prepareAlertValue() 内部发生了什么,因此它需要在每个摘要上调用此函数

于 2015-02-27T18:59:20.323 回答
0

callPrepareAlertValueCount是窗口上的全局变量,每当prepareAlertValue调用函数时都会更新。

问题是,只要发生摘要循环,就会调用它。每当进行更改时,例如触发单击事件(通过 Angular with ng-click),或者您的events数组被更改,都会触发 $digest 循环。当 $digest 被触发时,函数会重新评估所有角度观察者,并增加callPrepareAlertValueCount. 所以它发生的次数比events.length.

基本上,您不应该依靠这种方式保持计数器,因为您无法控制 $digest 循环运行的次数。

这是一个简单的Fiddle演示了这一点。

于 2015-02-27T18:59:28.663 回答
-1

您可以停止在 ng-repeat 中调用控制器函数。或者如果你想在循环中调用控制器函数(ng-repeat),然后使用适当的条件(在你的控制器中),如果为真则调用该函数,如果你不这样做,那么它将每次调用控制器函数.

于 2015-02-27T19:19:57.833 回答