所以我读到了关于Angular 2变化检测的这篇文章,但在阅读之后我感到更加困惑,所以我开始阅读一些导致更多混淆的评论.
如果组件仅依赖于其输入属性,并且它们是不可变的,那么当且仅当其中一个输入属性发生更改时,此组件才会更改.因此,我们可以跳过更改检测树中的组件子树,直到发生此类事件.当它发生时,我们可以检查一次子树,然后禁用它直到下一次更改(灰色框表示禁用更改检测器).
因此,如果{{todo.text}}或todo.checked更改,我们会标记我们的待办事项:Todo已发生更改
但是根据我的理解,我们可以创建一系列不可变对象.
如果我们积极使用不可变对象,那么大部分时间都会禁用更改检测树的大部分.
@Component({changeDetection:ChangeDetectionStrategy.OnPush}) class ImmutableTodoCmp { todo:Todo; }
那么在这种情况下,{{todo.text}}或todo.checked上的任何更改都不会被注意到吗?只有当Todo被推动时,我们才会看到变化?
如果组件仅依赖于其输入属性,并且它们是可观察的,那么当且仅当其中一个输入属性发出事件时,此组件才能更改.因此,我们可以跳过更改检测树中的组件子树,直到发生此类事件.当它发生时,我们可以检查一次子树,然后禁用它直到下一次更改.
虽然它可能听起来类似于Immutable Objects案例,但它却完全不同.如果您有一个具有不可变绑定的组件树,则更改必须从根开始遍历所有组件.处理可观察量时不是这种情况.
我不知道Observables与Immutables有什么不同,在Todo应用程序的这个特定情况下,哪种方法更好?
所以,就像我们从现在开始的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
数组是不可变Array
的John
s,它是不可变的,name
也是不可变的.所以为了改变约翰的名字.你需要生成一个新名称,一个新的 John和一个新的人员数组.
所以他们都改变了,需要遍历整棵树.那就是O(n)
.因此这个小评论:
如果您有一个具有不可变绑定的组件树,则更改必须从根开始遍历所有组件.
但
处理可观察量时不是这种情况.
为什么?
Observables发出事件.他们不需要改变像immutables这样的东西,他们只需要emit
改变事件.因此,在他的示例中,您没有需要重新创建的不可变"数组",因此重新评估树中的所有更改.现在你有了一个people
observable,它会在它发生变化时触发事件.并John
收到一个可观察的.
所以你可以触发一个事件,John
告诉他他的名字改变了,没有触发事件people
或类似的东西.O(log n)
根据此引用,避免重新扫描所有内容以进行更改,从而降低复杂性:
如您所见,这里Todos组件只有一个可观察的todos数组的引用.所以它无法看到个别待办事项的变化.
(强调我的).
希望这可以帮助.
我不知道Observables与Immutables有什么不同,在Todo应用程序的这个特定情况下,哪种方法更好?
想象一下,你有一个节点树,每个节点都有一个"我可能已经改变"的位.有了Observable
,我们正在讨论发生的事件 ; 事件将在树上发送.换一种说法:
Todo_ChangeDetector
会被标记,
然后走上树,Todos_ChangeDetector
会被标记,
然后走上树,App_ChangeDetector
会被标记,
然后正常变化检测开始.
想象一下,你有2个待办事项列表:
购物清单.
当天的会议清单(工作?).
你正在展示的哪个购物清单是活跃的Observable
; 例如下拉,导航丸等.这两个清单下的所有待办事项都可以是Immutable
; 例如,您不是会议组织者,不能更改会议.