Angular 特殊情况下的OnPush变更检测
我用ngrx开发了Angular 2应用程序,我对OnPush变化检测感兴趣,以获得更好的性能。我读了几篇关于它的文章,其中说:“如果一个组件只依赖于它的输入属性,并且它们是不可变的,那么这个组件可以在并且仅当它的一个输入属性改变时改变。”。因此,关于OnPush,我有两个(简单的)问题: 1) 如果我的组件混合了@Input()属性而不是Input属性,那么OnPush是无用的吗 2) 对于只具有属性(无@Input)的组件,同样的问题Angular 特殊情况下的OnPush变更检测,angular,typescript,web-component,angular2-changedetection,Angular,Typescript,Web Component,Angular2 Changedetection,我用ngrx开发了Angular 2应用程序,我对OnPush变化检测感兴趣,以获得更好的性能。我读了几篇关于它的文章,其中说:“如果一个组件只依赖于它的输入属性,并且它们是不可变的,那么这个组件可以在并且仅当它的一个输入属性改变时改变。”。因此,关于OnPush,我有两个(简单的)问题: 1) 如果我的组件混合了@Input()属性而不是Input属性,那么OnPush是无用的吗 2) 对于只具有属性(无@Input)的组件,同样的问题 提前感谢:)OnPush不会影响组件的内部状态 如果你看
提前感谢:)OnPush不会影响组件的内部状态 如果你看维克多·萨夫金的这篇文章,他特别提到 值得注意的是,组件仍然可以具有私有可变 状态,只要它仅因输入被更新或 从组件模板内激发的事件。唯一的事情 不允许的OnPush策略取决于共享的可变状态。 在这里阅读更多关于它的信息
花时间在这篇文章以及他提到的文章上是值得的。你也可以调用
ChangeDetectorRef.detectChanges()
或ChangeDetectorRef.markForCheck()
在你的代码修改状态后调用更改检测。@GünterZöchbauer我不明白什么。如果我的组件没有输入属性,那么OnPush在它上面就没用了吗?我不认为有一个真正的场景,OnPush
是没用的。如果您的组件中没有任何绑定,可能会发生这种情况。如果您有一些偶尔更改的状态和绑定到此状态,那么OnPush
允许您将更改检测率限制在必要的最小值。@GünterZöchbauer Ok ty dude。我的最后一个问题,我想我会完全理解的。假设我们有一个组件树(a-B-C-D-E-F-G)。F触发一个事件。一种是OnPush检测策略。因为角度变化检测从根组件(A)开始,并且它有一个属性(并且没有变化出现在它上面),所以变化检测如何才能转到F组件?不能检查A的子树,对吗?我认为F
可以被视为在A
的模板内。如果是冒泡的DOM事件,那么它肯定是a
s模板中的事件,并且更改检测将在整个树上运行(如果G
不是OnPush
)。如果是绑定在E
中的@Output()。我不是100%确定,但我假设这也会导致A
运行更改检测,并运行整个树。