【问题标题】:Angular Change Detection on a route change路线变化的角度变化检测
【发布时间】:2018-05-07 20:24:48
【问题描述】:

我在 Angular 中阅读了一些关于 Change Detection 的好文章,并且对它是什么以及它是如何工作的有了一定的了解。但是到目前为止,我读过的每一篇文章都只关注Change Detection,当组件上发生某些事件或某些input 属性更改等时。我还没有找到任何文章关注route 更改时会发生什么? Change Detection 在这种情况下如何工作?此外,Angular 是否会立即将所有 HTML/DOM 更新推送到浏览器,还是会在发现任何 DOM 更新后立即不断地向浏览器提供信息?

【问题讨论】:

    标签: javascript angular dom routes angular2-changedetection


    【解决方案1】:

    路由不会触发更改检测。它唯一特定于更改检测的是marking for check 被激活的路由器出口组件:

    @Directive({selector: 'router-outlet', exportAs: 'outlet'})
    export class RouterOutlet implements OnDestroy, OnInit {
        ...
        activateWith(activatedRoute: ActivatedRoute, resolver: ComponentFactoryResolver|null) {
            ...
            // Calling `markForCheck` to make sure we will run the change detection when the
            // `RouterOutlet` is inside a `ChangeDetectionStrategy.OnPush` component.
            this.changeDetector.markForCheck();
            this.activateEvents.emit(this.activated.instance);
        }
    

    路由器被 NgZone 拦截的某些事件 UI 或其他(setTimeout、XHR)等导航,一旦代码完成执行更改检测过程就会启动。

    此外,Angular 是否会一次将所有 HTML/DOM 更新推送到浏览器 或者它是否会在找到任何内容后立即不断地为浏览器提供信息 DOM 更新?

    它在遍历每个组件时逐个元素地更新 DOM 元素。有关变更检测的最全面解释,请阅读以下文章中提到的所有文章:

    【讨论】:

    • 感谢您的评论和解释。我一直很喜欢阅读您的文章,即使我已经阅读了大部分(文章中提到),我会从另一个角度再次阅读它们。谢谢。
    • @ImranLatif,很高兴您发现它们有帮助。如果有帮助,您也可以将我的答案标记为已接受。祝你好运!
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多