【发布时间】:2014-02-08 02:54:24
【问题描述】:
由于每个 $digest 都会对所有手表进行评估,因此保持其数量较少是一种良好的性能做法。改写问题标题,当相关模板没有引用这些变量或方法时,在控制器内部的 $scope 上声明变量或方法是否有性能惩罚(如果有惩罚,可以将它们声明为控制器上的局部变量对象)。
【问题讨论】:
-
是的。每当范围内的任何内容发生变化(脏/干净检查)时,Angular 都会触发一个 $digest 循环。所以它必须遍历你范围内的每个变量并检查它是否改变了。
-
请注意,AngularJS 不会在任何时候发生变化时执行 $digest,只要范围是 $apply'd,它就会执行 $digest。
-
再次,它循环遍历 $$watchers 列表而不是整个范围。我从来没有听过有角的家伙说你应该避免在他们只警告 $watchers 的范围内保留不必要的数据。
-
这里是a fiddle,可能会消除一些混乱。它显示每次运行 $digest 并更改两个范围变量 - 一个,每四分之一秒,在 Angular 外部完成(使用
setInterval)和一个,每 2 秒,使用 Angular 的 $interval“在 Angular 内部”完成 - 所以它完成了申请内。只有 Angular 感知的 undate 会触发 $digest,但是一旦出现摘要,两个绑定都会更新。 -
在实际阅读了代码之后,我可以说我大错特错了。 Angular 不会检查范围内的所有内容。它只关心观察者。