Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 特殊情况下的OnPush变更检测_Angular_Typescript_Web Component_Angular2 Changedetection - Fatal编程技术网

Angular 特殊情况下的OnPush变更检测

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不会影响组件的内部状态 如果你看

我用ngrx开发了Angular 2应用程序,我对OnPush变化检测感兴趣,以获得更好的性能。我读了几篇关于它的文章,其中说:“如果一个组件只依赖于它的输入属性,并且它们是不可变的,那么这个组件可以在并且仅当它的一个输入属性改变时改变。”。因此,关于OnPush,我有两个(简单的)问题:

1) 如果我的组件混合了@Input()属性而不是Input属性,那么OnPush是无用的吗

2) 对于只具有属性(无@Input)的组件,同样的问题


提前感谢:)

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
运行更改检测,并运行整个树。