当前位置:  开发笔记 > 编程语言 > 正文

用Observable和Immutable改变检测

如何解决《用Observable和Immutable改变检测》经验,为你挑选了2个好方法。

所以我读到了关于Angular 2变化检测的这篇文章,但在阅读之后我感到更加困惑,所以我开始阅读一些导致更多混淆的评论.

不可变对象

如果组件仅依赖于其输入属性,并且它们是不可变的,那么当且仅当其中一个输入属性发生更改时,此组件才会更改.因此,我们可以跳过更改检测树中的组件子树,直到发生此类事件.当它发生时,我们可以检查一次子树,然后禁用它直到下一次更改(灰色框表示禁用更改检测器).

因此,如果{{todo.text}}todo.checked更改,我们会标记我们的待办事项:Todo已发生更改 不可变的物体

但是根据我的理解,我们可以创建一系列不可变对象.

如果我们积极使用不可变对象,那么大部分时间都会禁用更改检测树的大部分.

级联不可变的obejcts

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

那么在这种情况下,{{todo.text}}todo.checked上的任何更改都不会被注意到吗?只有当Todo被推动时,我们才会看到变化?

可观察对象

如果组件仅依赖于其输入属性,并且它们是可观察的,那么当且仅当其中一个输入属性发出事件时,此组件才能更改.因此,我们可以跳过更改检测树中的组件子树,直到发生此类事件.当它发生时,我们可以检查一次子树,然后禁用它直到下一次更改.

虽然它可能听起来类似于Immutable Objects案例,但它却完全不同.如果您有一个具有不可变绑定的组件树,则更改必须从根开始遍历所有组件.处理可观察量时不是这种情况.

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



1> arg20..:

所以,就像我们从现在开始的5岁儿童一样.

这是JohnCmp.John是一个接受两个输入的组件,a name: {first: 'John', last: 'Smith'}和an age: 20.

如果name是可变的会发生什么?好吧,有人可以将它传递给John并持有它的引用.这样John和任何其他对象或服务都可以保存对该name对象的引用.这意味着他们可以改变它,比如说name.last = 'foo'.约翰的名字现在改变了,但他没有收到新的名字.他仍然提到了这个name对象,但它发生了变异.

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

好了,现在,没有人想象到拥有一个参考John名称对象.因此,如果他们想给他一个新名字,他们必须传递一个新的名字对象.然后,John改变只有当他输入的变化.这就是这里的含义:

如果组件仅依赖于其输入属性,并且它们是不可变的,那么当且仅当其中一个输入属性发生更改时,此组件才会更改.因此,我们可以跳过更改检测树中的组件子树,直到发生此类事件.

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

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

如果您有一个具有不可变绑定的组件树,则更改必须从根开始遍历所有组件.

处理可观察量时不是这种情况.

为什么?

Observables发出事件.他们不需要改变像immutables这样的东西,他们只需要emit改变事件.因此,在他的示例中,您没有需要重新创建的不可变"数组",因此重新评估树中的所有更改.现在你有了一个peopleobservable,它会在它发生变化时触发事件.并John收到一个可观察的.

所以你可以触发一个事件,John告诉他他的名字改变了,没有触发事件people或类似的东西.O(log n)根据此引用,避免重新扫描所有内容以进行更改,从而降低复杂性:

如您所见,这里Todos组件只有一个可观察的todos数组的引用.所以它无法看到个别待办事项的变化.

(强调我的).

希望这可以帮助.



2> dnozay..:

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

想象一下,你有一个节点树,每个节点都有一个"我可能已经改变"的位.有了Observable,我们正在讨论发生的事件 ; 事件将在树上发送.换一种说法:

Todo_ChangeDetector 会被标记,

然后走上树,Todos_ChangeDetector会被标记,

然后走上树,App_ChangeDetector会被标记,

然后正常变化检测开始.

想象一下,你有2个待办事项列表:

    购物清单.

    当天的会议清单(工作?).

你正在展示的哪个购物清单是活跃的Observable; 例如下拉,导航丸等.这两个清单下的所有待办事项都可以是Immutable; 例如,您不是会议组织者,不能更改会议.

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有