11

KnockoutJS 有计算 observables 的概念,它是依赖于一个或多个 observables 的函数。Knockout 能够确定计算的 observable 的依赖关系,如文档中所述

每当你声明一个计算的 observable 时,KO 立即调用它的求值函数来获取它的初始值。当您的评估器功能运行时,KO 会记录您的评估器读取其值的任何可观察对象(或计算的可观察对象)。

现在,我不明白的是,如果您的计算 observable 包含条件逻辑,这是如何工作的。如果 Knockout 调用 evaluator 函数,那么条件逻辑肯定会导致函数所依赖的 observables 未被调用吗?

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

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

谁能解释一下如何?

4

2 回答 2

13

每次重新评估dependentObservable 时都会再次跟踪依赖关系。因此,如果您有条件逻辑,那么未命中的分支将不会对依赖项做出贡献。

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

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

于 2012-04-13T19:56:12.463 回答
1

在淘汰赛中,依赖项是通过它的单个跟踪器变量来跟踪的ko.dependencyDetection

  1. 因此,每当您声明一个计算变量时,Knockout 都会立即调用它的求值函数来获取它的初始值和依赖关系。
  2. 因此,在第一次调用期间,它将注册它的依赖项lastNamecondition变量。
  3. 现在,每当lastName更改时,它都会更新它的所有依赖值。
  4. 每当condition更改时,它将再次运行它的评估器功能并更新所有依赖项。所以它将添加firstName为依赖项并删除lastName

所以,这就是依赖跟踪在淘汰赛中的工作方式。

于 2016-11-02T04:55:30.983 回答