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
),并且不再需要它,但它是 父作用域是否需要手动销毁它。