当我们在Knockout中声明一个计算的observable时,我们所要做的就是传递一个函数,只要这个函数包含的一个observable得到更新,它就会更新这个。
示例,来自Knockout文档:
function AppViewModel() {
this.firstName = ko.observable('Bob');
this.lastName = ko.observable('Smith');
this.fullName = ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
}
我的问题很简单,但我没有找到任何相关的信息:计算机如何知道传递的函数中包含哪些observable?它是否会在初始化过程中执行某些反射,就像发现它们一样?
我不是一个JS大师所以也许我错过了一些明显的东西,但是如果有人可以指出一条信息......
答案 0 :(得分:2)
How dependency tracking works页面在高级别描述了在评估依赖(计算)可观察量时会发生什么。然而,它并没有深入探讨它是如何实现的。它实际上非常有趣。
首先,可观察的和可观察的观察者。从概念上讲,这些只是具有价值的简单功能。 Observables会保留您给出的值,如果您调用它,它将返回给您。如果更新了在其评估函数中找到的任何其他可观察对象或从属可观察对象,则依赖可观察对象将自行更新。
但是依赖观察者如何在评估者中真正了解这些可观察的观察者和依赖观察者?
当读取可观察或从属观察值的值时,你实际上做的不仅仅是检索值。在幕后,当获取值时,您还会在当前依赖性检测帧上注册依赖项。框架是用于跟踪自框架创建以来调用哪些可观察对象和从属可观察对象的机制。
启用依赖项检测时会创建帧,这通常是在评估依赖的可观察值函数时。当依赖的可观察对象依赖于其他可观察对象并嵌套时,这些框架当然可以嵌套。评估函数完成后,框架将被删除。
这就是它的要点。如果您真的想了解详细信息,请查看debug source。
答案 1 :(得分:-2)
有一个流行的约定,它不需要完全跟踪它:如果你的viewmodel的构造函数将对它的引用复制到另一个变量(传统上称为self),那么你可以在整个视图模型中使用self而不必担心关于它被重新定义以引用别的东西。