- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
技巧问题我还没有在文档中找到任何答案。
当 AppRef.tick()
被调用时(主要是通过 NgZone 补丁),一个变化检测周期被触发。它从树顶部的根组件到底部经过:
markForCheck
标记的组件(及其祖先)并跳过未标记的 OnPush 组件。
但是为什么当一个事件被一个组件触发时,它的所有祖先也会被检查?就像调用了 markForCheck
一样。
我期待与调用 AppRef.tick
时相同的行为。我不明白为什么要检查 OnPush parent 。在 this demo 上可以很好地看到这种行为.
最佳答案
也许你对OnPush的误解和我刚开始学习变化检测的时候一样:)。重点是:OnPush 策略不会改变任何关于触发 CD 周期的事件。这只是taken care of by zone.js by patching browser APIs . (除非手动触发 CD。)zone.js 不关心组件和 ChangeDetectionStrategies。并且 CD 总是从根目录开始为 @Chris Hamilton解释。
ChangeDetectionStrategy.Default 和 OnPush 的区别仅在于组件将在 CD 周期中实际被检查。
所以你原帖中的句子应该是:“已知 OnPush 策略仅在以下情况下标记要检查的组件”。
下面是我使用 Angular DevTools 的分析器观察到的示例.我在OnPush组件的ngOnInit中放了一个setTimeout(() => {}, 6000)
,它触发了一个CD循环(来源是“setTimeout”),但是并没有引起组件本身进行检查。
关于手动触发的detectChanges()、tick()和markForCheck()的区别:
ChangeDetectorReference.detectChanges()
通过尊重子组件的 CD 策略在此组件及其子组件上触发 CDApplicationRef.tick()
通过遵守 CD 策略为整个应用程序触发 CDChangeDetectorReference.markForCheck()
不会触发 CD,但会将所有 OnPush parents 标记为在当前或下一个 CD 周期中检查一次(解释得很好 here )
===编辑:更新问题的答案===
如果浏览器事件监听器在 OnPush 组件中被触发,这将导致 OnPush 组件被标记为检查。此外,它还会触发从组件根部开始的更改检测。
如果我理解正确的话,你的问题是:为什么 OnPush 组件的所有父组件也必须标记为检查?
回答:如果一个OnPush组件没有被标记为check,那么不仅这个组件会被跳过,这个组件下面的整个子树也会被跳过。这意味着,如果事件处理程序被触发的组件有一个带有 OnPush 的父组件不会被检查,它本身也不会被检查。或者,反过来说,如果要检查一个组件,则还必须检查它的所有祖先。
关于angular - 尽管有 OnPush 策略,为什么 Angular 会在 DOM 事件的父组件上触发 ChangeDetection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71945490/
我在使用登录后不刷新的组件时遇到困难。 该组件是 navbar.component,其中包含指向我的页面/组件的链接。在它上面,有一个呈现 login.component 的“登录”链接,我可以在上面
我想在使用 OnPush 变化检测策略上传之前预览多张图片。 我试试这个 https://stackblitz.com/edit/angular-mnltiv 当我添加 OnPush 时它停止工作,我
https://stackblitz.com/edit/angular-xpamld 问题:有人能帮我理解为什么我的原型(prototype)的 changeDetection: ChangeDete
我有一个有很多 child 的 Angular 2 组件。由于性能问题,我想检查 ChangeDetection 检查我的子组件的频率。所以我记录了我的一个子组件的 ngAfterViewChecke
我工作的组织中的一个私有(private)(但开源)Angular 包有一些代码如下所示: ngAfterViewInit(): void { setTimeout(() => { thi
考虑这个 plunker import {Component, OnInit, Input, OnChanges, DoCheck, ChangeDetectionStrategy, EventEmi
我有一个使用推送变化检测的 Angular 组件。组件有一个输入,在更新路由时由组件修改。如果我将输入分配给新的引用并对其进行修改,则模板中的值不会更新。我以为只要您分配了一个新对象,就会检测到更改,
技巧问题我还没有在文档中找到任何答案。 当 AppRef.tick() 被调用时(主要是通过 NgZone 补丁),一个变化检测周期被触发。它从树顶部的根组件到底部经过: 具有默认策略的每个组件 每个
在 Angular-2 项目中始终使用 是否合理? changeDetection: ChangeDetectionStrategy.OnPush 在组件的装饰器中?除非有明确的理由使用默认策略? 最
我是一名优秀的程序员,十分优秀!