2014-11-01 110 views
0

当我们在Knockout中声明一个可计算的观察值时,我们所要做的就是传递一个函数,该函数将更新此函数,只要此函数包含的某个可观察值得到更新。Knockout如何计算可观察寄存器与相关的可观测值?

例,从淘汰赛文档:

function AppViewModel() { 
    this.firstName = ko.observable('Bob'); 
    this.lastName = ko.observable('Smith'); 

    this.fullName = ko.computed(function() { 
     return this.firstName() + " " + this.lastName(); 
    }, this); 
} 

我的问题很简单,但我没有找到任何信息:如何做这些观测值都包含在传递函数计算知道吗?它是否在执行初始化时执行一些类似操作的反射来发现它们?

我不是JS大师,也许我失去了一些东西很明显,但如果有人能指出一条信息......

回答

2

How dependency tracking works页面描述在较高水平时,相关的(计算的)可观察到的评估发生了什么。然而,它并没有深入到实际上如何实现。这其实很有趣。

首先,观测量和相关观测量。从概念上讲,这些只是简单的具有价值的功能。观察对象会坚持你给它的价值,如果你打电话给它,它会将它返还给你。如果在其赋值函数中发现的其他可观测量或相关可观测量被更新,则相关可观测量将自行更新。

但是,依赖可观察事件究竟是如何在评估器中实际了解这些可观测量和相关可观测量?

当读取observable或dependent observable的值时,您实际上做的不仅仅是检索值。在幕后,获取该值时,您还注册了对当前依赖关系检测框架的依赖关系。该框架是用于跟踪从创建框架后调用的可观测量和相关可观测量的机制。

启用依赖性检测时会创建框架,这通常是在对依赖性可观察值函数进行评估时创建的。当依赖的可观测量依赖于其他可观测量并嵌套时,这些帧可以嵌套。评估程序功能完成后,框架将被删除。

这就是它的要义。如果你真的想深入细节,请看debug source

-2

有这完全避免了需要跟踪这是一个通用的惯例:如果您的viewmodel的构造函数将对此的引用复制到另一个变量(传统上称为self)中,然后您可以在整个视图模型中使用self,并且不必担心被重新定义为引用其他内容。

See this link