【问题标题】:does angularjs $watch every property on a $scope or only those referenced in template?angularjs $watch 是 $scope 上的每个属性还是仅在模板中引用的那些?
【发布时间】: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 不会检查范围内的所有内容。它只关心观察者。

标签: angularjs angularjs-scope


【解决方案1】:

当您在$scope 上放置一些东西时,它可以被观看。你可以$watch 范围内的任何东西都很好,即使它不在模板上。

有性能损失吗? AngularJS 通常在你观察对象时比较引用,并且只比较watched objects,而不是范围内的所有内容。因此,除非您对正在观看的非常大的对象或数组执行deep compare,否则不会花费太多时间。

要测试性能并查看您的更改是否会减慢速度,您可以使用AngularJS Batarang

【讨论】:

猜你喜欢
  • 2015-05-03
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多