- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑这个 plunker
import {Component, OnInit, Input, OnChanges, DoCheck, ChangeDetectionStrategy, EventEmitter} from 'angular2/core'
@Component({
selector: 'child11',
template: `
<button (click)="change_obj()">Button in Child11</button>
<div>This is child11: {{my_obj11['name']}}</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class Child11 {
@Input()
my_obj11: Object;
change_obj(){
this.my_obj11['name'] = 'some other name';
}
}
@Component({
selector: 'child1',
template: `
<child11 [my_obj11]="my_obj1"></child11>
<div>This is child1: {{my_obj1['name']}}</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
directives: [Child11]
})
export class Child1 {
@Input()
my_obj1: Object;
}
@Component({
selector: 'parent',
template: `
<div>
<child1 [my_obj1]="my_obj" ></child1>
This is my_obj in parent: {{my_obj['name']}}
</div>
`,
directives: [Child1]
})
export class App {
my_obj: Object = {'name': 'name1'};
}
这里是组件之间的关系
Parent
|
Child1
|
Child11
我们注意到 Child1
有 changeDetection: ChangeDetectionStrategy.OnPush
上面的代码非常简单,parent
发送一个对象给child1
,它发送完全相同的对象给child11
。
child11
然后更新对象的原语。
我们看到 parent
和 child1
的对象都更新了,即使 child1
有 changeDetection: ChangeDetectionStrategy.OnPush
我猜 changeDetection: ChangeDetectionStrategy.OnPush
只能以一种方式工作:从上到下。
这是真的吗?
如果是这样,有什么原因吗?
最佳答案
根据 Savkin's blog post (好吧,它隐藏在对@vivainio 的评论中),
使用OnPush
,Angular 只会在
| View /模板中的 async
以便运行更改检测。查看关于 this answer 的评论了解更多信息。]如果满足这些条件中的任何一个,Angular 将还将树上到根组件的所有组件“标记”为需要更改检测。然后它将运行更改检测。所有的祖先组件,即使它们是为 OnPush
策略配置的,都将检查更改,因为它们当前已“标记”。
这解释了为什么 Parent/App 和 Child1 组件的 View 会因组件 Child11 中的事件触发而更新。
这种“标记树”功能是设计使然,并且出于您在示例代码中显示的确切原因/场景——即,一个组件更改了一些应用程序数据,并且祖先组件在它们的相同数据中具有数据绑定(bind)意见。 Angular 如何确保 View 得到更新?它必须“标记”直到根组件的所有祖先,以便在运行更改检测时检查所有这些组件。
请注意,这并未涵盖所有情况。假设更改的应用程序数据也存在于组件树的某个其他不相关“分支”的组件 View 中,并且该分支使用 OnPush
。该组件 View 将不会更新。
关于javascript - angular2中的 `changeDetection: ChangeDetectionStrategy.OnPush`是否只在一个方向上起作用: top->bottom?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36815706/
我有两个组件,都设置为 OnPush。调用 getAccount() 后,父组件将 accountLoading 设置为 true,然后在调用完成后将 accountLoading 设置为 false
我正在尝试衡量变化检测策略的性能差异。 我已经添加了 Angular 分析器,并使用 Default 检查,然后将 onPush 添加到我们的大多数组件,这些是结果:(开发模式) 默认:{ msPer
我不明白为什么子组件的更改检测会在这种情况下运行: import { Component, ChangeDetectionStrategy } from '@angular/core' @Compon
我不明白为什么子组件的更改检测会在这种情况下运行: import { Component, ChangeDetectionStrategy } from '@angular/core' @Compon
最好的使用方法是什么OnPush更改检测可以使更改灵活并且在测试中也非常简单?通过各种教程,我发现可以使用 OnPush : 首先是在 View 中直接使用服务中的可观察对象,我不确定该方法是否有效。
可能是我误解了 Angular changeDetection 策略。 这里是描述: 我有 2 个同级组件(S1 和 S2) 将这两个组件都视为显示一些图形数据的小部件 加载时,我想一开始就在两个
我正在编写一个 Angular 2 应用程序,出于性能原因,我尝试在所有地方使用 ChangeDetectionStrategy.OnPush。我有一个复杂的组件需要 OnPush 才能顺利工作,其中
我有一个看起来像这样的子组件: @Component({ selector: 'app-child', changeDetection: ChangeDetectionStrategy.OnP
我正在尝试熟悉 Angular 2 的 ChangeDetectionStrategy.OnPush 性能提升(如 here 所述)。但我这里有古玩盒。 我有父 AppComponent: @Comp
我正在构建一个包含许多组件的 Angular 4 应用程序,其中 ChangeDetectionStrategy 是 OnPush。同时the Angular Documentation on the
我是否应该始终在我的组件中使用 ChangeDetectionStrategy.OnPush? 我总是听说 OnPush 非常棒,它解决了很多问题,加快了 Angular 应用程序的速度,甚至摆脱了
我有一个数据表组件 ( angular2-data-table) 项目,我们将项目从 Angular 的传统变化检测更改为 OnPush 以优化渲染速度。 实现新的变更检测策略后,当数据对象发生突变(
我有一个使用服务提交一些数据的组件。 该组件使用 ChangeDetectionStrategy.OnPush ,但发生了一些奇怪的事情: 当请求 成功 : next回调被调用,formStatus更
正如标题所说:我正在处理一个非常大的项目,而且我使用过的组件很少 ChangeDetectionStrategy.OnPush以免表现不佳。我想知道,将策略的每个组件都放入“好”,以防万一,使用 Ch
我在理解 Angular OnPush 检测策略时遇到问题。当我执行一些异步操作时(例如从 TS 打开覆盖,这样就不会导致使用 OnPush 策略检测组件上的更改),然后我单击任意位置,或调用其他检测
我想在使用 OnPush 变化检测策略上传之前预览多张图片。 我试试这个 https://stackblitz.com/edit/angular-mnltiv 当我添加 OnPush 时它停止工作,我
我有一个使用 ngFor 显示子组件列表的父组件。我注意到随着 child 数量的增加,性能变得非常糟糕,所以我将两者都更改为 OnPush 更改检测策略。 这很有帮助,但仍然有一些情况会变慢,我可以
https://stackblitz.com/edit/angular-xpamld 问题:有人能帮我理解为什么我的原型(prototype)的 changeDetection: ChangeDete
当我们使用默认策略时,这些家伙可以触发变更检测(当然除了输入参数): 用户事件 计时器 ajax 响应 但是。当您切换到 OnPush 策略 时,它仅由事件 触发并且不适用于计时器和 http。 所以
@Component({ selector: "parent", template: ``, changeDetection: ChangeDetectionStrategy.
我是一名优秀的程序员,十分优秀!