【发布时间】:2015-12-16 13:44:10
【问题描述】:
所以我阅读了this article 关于 Angular 2 更改检测的内容,但在阅读之后我变得更加困惑,所以我开始阅读一些导致更多困惑的 cmets。
不可变对象
如果一个组件只依赖于它的输入属性,并且它们是 不可变的,那么当且仅当它的一个组件可以改变 输入属性改变。因此,我们可以在变化检测树中跳过组件的子树,直到发生这样的事件。发生这种情况时,我们可以检查一次子树,然后禁用它直到下一次更改(灰色框表示禁用更改检测器)。
所以如果 {{todo.text}} 或 todo.checked 更改我们标记我们的 todo:Todo 发生了变化
但是根据我的理解,我们可以创建级联的不可变对象。
如果我们积极地使用不可变对象,那么很大一部分 大多数情况下更改检测树将被禁用。
@Component({changeDetection:ChangeDetectionStrategy.OnPush})
class ImmutableTodoCmp {
todo:Todo;
}
所以在这种情况下,{{todo.text}} 或 todo.checked 上的任何更改都不会被注意到,对吧?只有当 Todo 被推送时,我们才会看到变化?
可观察对象
如果一个组件只依赖于它的输入属性,并且它们是可观察的,那么当且仅当它的一个输入属性发出一个事件时,这个组件才能改变。因此,我们可以在变化检测树中跳过组件的子树,直到发生这样的事件。发生这种情况时,我们可以检查一次子树,然后禁用它直到下一次更改。
虽然它可能听起来类似于不可变对象的情况,但它是完全不同的。如果您有一棵具有不可变绑定的组件树,则更改必须从根开始遍历所有组件。在处理 observables 时情况并非如此。
我不明白 Observables 与 Immutables 有何不同,在 Todo 应用的这种特定情况下,哪种方法更好?
【问题讨论】:
标签: angular