【问题标题】:Why event triggers ChangeDetection even if OnPush strategy is ON?为什么即使 OnPush 策略为 ON,事件也会触发 ChangeDetection?
【发布时间】:2017-08-04 21:23:29
【问题描述】:

当我们使用默认策略时,这些人可能会触发更改检测(当然除了输入参数):

  • 用户事件
  • 定时器
  • ajax 响应

但是。当您切换到 OnPush 策略 时,它仅由 事件 触发,不适用于计时器和 http。

所以问题是为什么它不适用于时间和 https 或为什么它适用于事件。

【问题讨论】:

    标签: angular


    【解决方案1】:

    OnPush 就是这样定义的。

    触发变更检测

    • 接收到组件侦听的 DOM 事件时
    • |async 管道收到新事件时
    • @Input() 被更改检测更新时。
    • 在使用ChangeDetectorRef::markForCheck 明确注册要检查的下一个更改检测轮次的组件时

    ChangeDetectionStrategy.Default 为在 Angulars 区域内调用的每个异步回调触发更改检测(甚至在 Angular 应用程序中侦听的每个 DOM、每个 Observable 事件或完成的 Promise、setTimeout ......)

    【讨论】:

    • 考虑到DOM 事件,这是否包括模板内的任何(event) 绑定,还是仅包括@HostListeners
    • 在 Angular 区域内注册了事件侦听器的每个事件,包括 xxx.addEventListener()(domEvent)@HostListener()
    • 是的,是的,但是如果一个组件设置为OnPush,那么我猜如果你在组件的逻辑里面有xxx.addEventListener(),就不会触发变更检测,对吧?
    • xxx.addEventListener() 不会运行 markForCheck plnkr.co/edit/k56NahyP8bdagVbjnOPl?p=preview
    • @yurzui 再次感谢。我的意思是它会导致更改检测与ChangeDetectionStrategy.Default 一起运行,但这可能不是评论的内容。对于OnPush,只有(click)@HostListener()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多