gpt4 book ai didi

angularjs - Angular 什么时候清除 $watch?

转载 作者:行者123 更新时间:2023-12-03 08:04:25 25 4
gpt4 key购买 nike

我了解我在 View 中包含的每个模型都会进入摘要循环和 $watch应用它,因为所有 Angular 应用程序基本上都是一页应用程序。但是什么时候清除 $watch ?

例如,假设我有页面 view1.html使用模板 {{view.name1}} .当我将路由切换到页面view2.html使用模板 {{view.name2}} , $watch{{view.name1}}是自动注销还是我应该手动注销?

最佳答案

这个答案有链接到 angular scopes源代码,

每个作用域都有一个私有(private)数组 $$watchers :

  • 当方法$watch被称为它将听众插入$$watchers ,见 Scope#$watch .
  • 每个 $digest它遍历所有 $$watchers ,见 Scope#$digest .
  • 当范围方法$destroy被称为清理所有的观察者,见 Scope#$destroy
  • 每个范围还广播$destroy到它的所有子作用域,无论是否孤立,所以你永远不会有一个孤立的作用域。
  • Angular 监听 DOM 节点移除并触发 $destroy对于所有指令范围(在 $compile 服务中创建的),见 here


  • Angular 自动调用 $destroy在这些情况下:
  • https://github.com/angular/angular.js/blob/v1.3.2/src/ng/directive/ngIf.js#L111
  • https://github.com/angular/angular.js/blob/v1.3.2/src/ng/directive/ngInclude.js#L206
  • https://github.com/angular/angular.js/blob/v1.3.2/src/ng/directive/ngRepeat.js#L389
  • https://github.com/angular/angular.js/blob/v1.3.2/src/ng/directive/ngSwitch.js#L160
  • https://github.com/angular/angular.js/blob/v1.3.2/src/ngRoute/directive/ngView.js#L205


  • 您只需调用 $destroy当您手动创建范围( $new/ $transclude )并希望它们在其父范围之前被销毁时。
    ngView可能是一个很好的例子,因为您的应用程序中只有一个绑定(bind)到它的元素,并且该元素(其范围通常是 rootScope)永远不会被破坏。所以 Angular 在进入路由并调用 $new 时会自动创建一个新的子作用域( $destroy)当存在时,它会刷新所有由该路由创建的观察者。

    来自 Scope#$new docs :

    $destroy() must be called on a scope when it is desired for the scope and its child scopes to be permanently detached from the parent and thus stop participating in model change detection and listener notification by invoking.



    来自 $compile - transclusion functions docs :

    if you intend to add and remove transcluded content manually in your directive (by calling the transclude function to get the DOM and and calling element.remove() to remove it), then you are also responsible for calling $destroy on the transclusion scope.



    以此为规则,如果您手动创建了一个范围(使用 $new$transclude )并且不再需要它,但它
    父范围是否需要手动销毁它。

    关于angularjs - Angular 什么时候清除 $watch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830122/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com