Angularjs Angular什么时候结算$watch?
我知道我在视图中包含的每个模型都会进入摘要循环,并在其上应用Angularjs Angular什么时候结算$watch?,angularjs,Angularjs,我知道我在视图中包含的每个模型都会进入摘要循环,并在其上应用$watch,因为所有角度应用程序基本上都是一页应用程序。但是它什么时候清除$watch 例如,假设我有一个带有模板{{view.name1}的页面view1.html。当我使用模板{view.name2}切换到页面view2.html时,{{view.name1}上的$watch是否自动取消注册,还是我应该手动取消注册?这个答案有到源代码的链接, 每个作用域都有一个专用数组$$watchers: 调用方法$watch时,它将侦听器推
$watch
,因为所有角度应用程序基本上都是一页应用程序。但是它什么时候清除$watch
例如,假设我有一个带有模板{{view.name1}
的页面view1.html
。当我使用模板{view.name2}
切换到页面view2.html
时,{{view.name1}
上的$watch
是否自动取消注册,还是我应该手动取消注册?这个答案有到源代码的链接,
每个作用域都有一个专用数组$$watchers
:
- 调用方法
时,它将侦听器推入$watch
,请参阅$$watchers
- 对于每个
,它会向下迭代所有$digest
,请参阅$$watchers
- 调用scope方法
时,它会清除所有的监视程序,请参阅$destroy
- 每个作用域还将
广播到它的所有子作用域(无论是否隔离),因此您永远不会有孤立作用域$destroy
- Angular侦听DOM节点删除并触发所有指令作用域(在$compile服务中创建)的
,请参阅$destroy
Angular会在以下情况下自动调用
$destroy
:
手动创建作用域(
$new
/$transclude
)并希望在其父作用域之前销毁它们时,只需调用$destroy
ngView
可能是一个很好的例子,因为您的应用程序中只有一个绑定到它的元素,并且该元素(其作用域通常是根作用域)永远不会被销毁。因此,angular在进入路由时自动创建一个新的子作用域($new
),并在存在时对其调用$destroy
,从而刷新该路由创建的所有监视程序
发件人:
$destroy()必须在作用域需要时对其调用
和它的子作用域将从父作用域和
因此,停止参与模型更改检测和侦听器
通过调用发出通知
发件人:
如果您打算在中手动添加和删除转写的内容
指令(通过调用transclude函数来获取DOM和
调用element.remove()来删除它),那么您也要负责
用于在转换作用域上调用$destroy
如果您手动创建了一个作用域(使用
$new
或$transclude
),并且不再需要它,但它是
父作用域是否需要手动销毁它。