KnockoutJS具有计算的可观察量的概念,它是依赖于一个或多个可观察量的函数。淘汰赛能够determine the dependencies of a computed observable as described in the docs:
每当你声明一个计算的observable时,KO立即调用它 求值函数获取其初始值。而你的评估员 函数正在运行,KO保留任何可观察量的日志(或计算 observables)你的评估者读取。的值。
现在,我不明白的是,如果你的计算的observable包含条件逻辑,它是如何工作的。如果Knockout调用求值函数,肯定条件逻辑可能会导致函数依赖于不被调用的可观察对象?
我创造了这个小提琴来测试:
var ViewModel = function(first, last) {
this.firstName = ko.observable(first);
this.lastName = ko.observable(last);
this.condition = ko.observable(false);
// at the point of evaluation of this computed observabled, 'condition'
// will be false, yet the dependecy to both firstName and lastName is
// identified
this.fullName = ko.computed(function() {
return this.condition() ? this.firstName() : this.lastName();
}, this);
};
然而,Knockout以某种方式正确识别了firstName
和lastName
的依赖关系。
任何人都可以解释一下吗?
答案 0 :(得分:13)
依赖关系。因此,如果您有条件逻辑,那么未命中的分支将不会对依赖性做出贡献。
在您的小提琴中,如果您修改firstName
,则在您切换condition
之前,该值不会更新。此时,lastName
不再是依赖项,因此对它的更改不会触发dependentObservable。
它并不比原始描述复杂得多。要记住的基本事项是每次重新评估依赖关系时都会记录它们。
答案 1 :(得分:1)
通过它的单跟踪器变量ko.dependencyDetection
跟踪敲除依赖关系。
lastName
和condition
变量的依赖。lastName
更改时,它都会更新所有相关值。condition
更改时,它将再次运行它的评估函数并更新所有依赖项。因此,它会将firstName
添加为依赖项并删除lastName
。因此,这就是依赖跟踪在淘汰赛中的工作方式。