角度 – 观察与不变的变化检测

前端之家收集整理的这篇文章主要介绍了角度 – 观察与不变的变化检测前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我读了 this article关于AngularJS 2的变化检测,但是在阅读之后,我更加困惑,所以我开始阅读一些导致更多混乱的评论.

不变物体

If a component depends only on its input properties,and they are
immutable,then this component can change if and only if one of its
input properties changes. Therefore,we can skip the component’s subtree in the change detection tree until such an event occurs. When it happens,we can check the subtree once,and then disable it until the next change (gray Boxes indicate disabled change detectors).

所以如果{{todo.text}}或者todo.checked改变我们标记我们的做法:Todo发生了一个变化

但是从我的理解,我们可以创建一个不可变的对象的级联.

If we are aggressive about using immutable objects,a big chunk of the
change detection tree will be disabled most of the time.

@Component({changeDetection:ChangeDetectionStrategy.OnPush})
class ImmutableTodoCmp {
  todo:Todo;
}

所以在这种情况下,{{todo.text}}或todo.checked的任何更改都不会被注意到吗?只有当一个Todo被推开时,我们会看到一个变化?

可观察物体

If a component depends only on its input properties,and they are observable,then this component can change if and only if one of its input properties emits an event. Therefore,and then disable it until the next change.

Although it may sound similar to the Immutable Objects case,it is quite different. If you have a tree of components with immutable bindings,a change has to go through all the components starting from the root. This is not the case when dealing with observables.

我不知道Observables与Immutables有什么不同,在Todo应用程序的这个具体情况下,哪种方法更好?

所以,就像我们现在5岁.

这是JohnCmp.约翰是一个接受两个输入的组件,一个名字是:{first:’John’,last:’Smith’},一个年龄:20.

如果名称可变,会发生什么?那么有人可以把它传给约翰,并提到它.所以约翰和任何其他对象或服务的数量可以保存对该名称对象的引用.这意味着他们可以改变它,比如说name.last =’foo’.约翰的名字现在改变了,但他没有收到一个新的名字.他仍然提到这个名字对象,但它变异了.

如果我们想要检测这个,我们必须积极地检查名称,name.first,name.last等等,以及我们传递的每个对象的每个属性.要做名字=== newName多少容易,只是比较引用,嘿?如果名字是不可变的,我们不需要疯狂检查每个属性,我们可以检查引用并知道对象是否快速更改.

好吧,现在,想像没有人提到约翰的名字对象.所以如果他们想给他一个新的名字,他们必须传入一个新的名字对象.然后约翰只有在他的输入变化时才会改变.这就是这里的意思:

If a component depends only on its input properties,and they are immutable,then this component can change if and only if one of its input properties changes. Therefore,we can skip the component’s subtree in the change detection tree until such an event occurs.

好的,这是基本的情况吗?现在我们不用担心检查每个属性,我们只是检查引用没有改变.大大改善!但是对象可能很大.所以一个人数组是不可变的约翰斯数组,它们是不可变的,名字也是不变的.所以为了改变约翰的名字.你需要生产一个新的名字,一个新的John和一个新的人物阵列.

所以他们都改变了,整个树需要遍历.那就是O(n).所以这个小小的评论

If you have a tree of components with immutable bindings,a change has to go through all the components starting from the root.

This is not the case when dealing with observables.

为什么

观察点发射事件.他们不需要改变一切,像不变的,他们只需要发出一个变化的事件.所以在他的例子中,你没有一个不可改变的“数组”,您需要重新创建,因此重新评估树上的所有更改.现在你有一个可观察的人,当它改变时触发事件.约翰也收到一个可观察的.

所以你可以在约翰告诉他他的名字改变了,没有触发一个事件在人或事情的类型.避免您重新扫描所有内容以进行更改,从而降低O(log n)的复杂性,具体如下:

As you can see,here the Todos component has only a reference to an observable of an array of todos. So it cannot see the changes in individual todos.

(强调我的).

希望这可以帮助.

猜你在找的Angularjs相关文章