角度 – 观察与不变的变化检测
所以我读了
this article关于AngularJS 2的变化检测,但是在阅读之后,我更加困惑,所以我开始阅读一些导致更多混乱的评论.
不变物体
所以如果{{todo.text}}或者todo.checked改变我们标记我们的做法:Todo发生了一个变化 但是从我的理解,我们可以创建一个不可变的对象的级联.
@Component({changeDetection:ChangeDetectionStrategy.OnPush}) class ImmutableTodoCmp { todo:Todo; } 所以在这种情况下,{{todo.text}}或todo.checked的任何更改都不会被注意到吗?只有当一个Todo被推开时,我们会看到一个变化? 可观察物体
我不知道Observables与Immutables有什么不同,在Todo应用程序的这个具体情况下,哪种方法更好?
所以,就像我们现在5岁.
这是JohnCmp.约翰是一个接受两个输入的组件,一个名字是:{first:’John’,last:’Smith’},一个年龄:20. 如果名称可变,会发生什么?那么有人可以把它传给约翰,并提到它.所以约翰和任何其他对象或服务的数量可以保存对该名称对象的引用.这意味着他们可以改变它,比如说name.last =’foo’.约翰的名字现在改变了,但他没有收到一个新的名字.他仍然提到这个名字对象,但它变异了. 如果我们想要检测这个,我们必须积极地检查名称,name.first,name.last等等,以及我们传递的每个对象的每个属性.要做名字=== newName多少容易,只是比较引用,嘿?如果名字是不可变的,我们不需要疯狂检查每个属性,我们可以检查引用并知道对象是否快速更改. 好吧,现在,想像没有人提到约翰的名字对象.所以如果他们想给他一个新的名字,他们必须传入一个新的名字对象.然后约翰只有在他的输入变化时才会改变.这就是这里的意思:
好的,这是基本的情况吗?现在我们不用担心检查每个属性,我们只是检查引用没有改变.大大改善!但是对象可能很大.所以一个人数组是不可变的约翰斯数组,它们是不可变的,名字也是不变的.所以为了改变约翰的名字.你需要生产一个新的名字,一个新的John和一个新的人物阵列. 所以他们都改变了,整个树需要遍历.那就是O(n).所以这个小小的评论:
但
为什么 观察点发射事件.他们不需要改变一切,像不变的,他们只需要发出一个变化的事件.所以在他的例子中,你没有一个不可改变的“数组”,您需要重新创建,因此重新评估树上的所有更改.现在你有一个可观察的人,当它改变时触发事件.约翰也收到一个可观察的. 所以你可以在约翰告诉他他的名字改变了,没有触发一个事件在人或事情的类型.避免您重新扫描所有内容以进行更改,从而降低O(log n)的复杂性,具体如下:
(强调我的). 希望这可以帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |