ng重复调用控制器功能的次数太多
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>
很久以前-我的自定义指令。它执行个事件。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,那么如果你不调用该函数,那么它每次都会调用控制器函数。
- 一个html元素的克隆次数太多
- ExtJS类的最佳实践最终导致了太多的.JS文件.性能怎么样
- 使用.slice分页选择了太多项目
- 堆排序实现进行了太多比较
- 如何在不每秒调用太多次的情况下通过Soundcloud解析api进行循环
- 如何修复“;太多递归”;ReactJS中的错误
- 为什么fs.readFile在windows上花费太多时间
- 如何避免webGL着色器加载给cpu带来太多负载
- 使用多功能框在 chrome 扩展程序中包含内联自动填充功能的任何方法
- node.js 需要太多的 TCP 套接字
- JavaScript循环迭代太多
- 函数崩溃,因为太多迭代jQuery
- 为什么不'当用户输入空格或字符太多/不够时,此函数会发出window.alert
- Angularjs:为什么重复做太多的工作
- Node.js错误:参数太多上传批量数据时出错
- ng重复调用控制器功能的次数太多
- 我正在验证一个联系人表单.我是不是过滤太多了
- Jquery-append函数花费了太多时间
- 为什么首先单击文档空白处的任何位置启动代码,而不是单击超链接,以及为什么打开了太多选项卡
- ExtJs:最佳列表组件?网格的功能太多了