KnockoutJS - 具有条件语句的计算可观察量如何工作

时间:2012-04-13 19:25:11

标签: knockout.js

KnockoutJS具有计算的可观察量的概念,它是依赖于一个或多个可观察量的函数。淘汰赛能够determine the dependencies of a computed observable as described in the docs

  

每当你声明一个计算的observable时,KO立即调用它   求值函数获取其初始值。而你的评估员   函数正在运行,KO保留任何可观察量的日志(或计算   observables)你的评估者读取。的值。

现在,我不明白的是,如果你的计算的observable包含条件逻辑,它是如何工作的。如果Knockout调用求值函数,肯定条件逻辑可能会导致函数依赖于不被调用的可观察对象?

我创造了这个小提琴来测试:

http://jsfiddle.net/bJK98/

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以某种方式正确识别了firstNamelastName的依赖关系。

任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:13)

每次重新评估dependentObservable时,都会再次跟踪

依赖关系。因此,如果您有条件逻辑,那么未命中的分支将不会对依赖性做出贡献。

在您的小提琴中,如果您修改firstName,则在您切换condition之前,该值不会更新。此时,lastName不再是依赖项,因此对它的更改不会触发dependentObservable。

它并不比原始描述复杂得多。要记住的基本事项是每次重新评估依赖关系时都会记录它们。

答案 1 :(得分:1)

通过它的单跟踪器变量ko.dependencyDetection跟踪敲除依赖关系。

  1. 因此,无论何时声明计算变量,Knockout都会立即调用其求值函数来获取它的初始值和依赖关系。
  2. 因此,在第一次调用期间,它将注册它对lastNamecondition变量的依赖。
  3. 现在每当lastName更改时,它都会更新所有相关值。
  4. 每当condition更改时,它将再次运行它的评估函数并更新所有依赖项。因此,它会将firstName添加为依赖项并删除lastName
  5. 因此,这就是依赖跟踪在淘汰赛中的工作方式。