【问题标题】:KnockoutJS - How do computed observables with conditional statements workKnockoutJS - 使用条件语句计算的 observables 如何工作
【发布时间】:2012-04-26 04:29:17
【问题描述】:

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

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

现在,我不明白的是,如果您的计算 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 的依赖关系。

谁能解释一下?

【问题讨论】:

  • 无法回答问题,我相信计算的 observables 通过评估所有依赖项来确定运行时自己的状态,所以一切看起来都清晰明了,抱歉,但无法得到您问题的重点
  • 好问题。我一直认为您引用的手册中描述的方法非常聪明,但是既然您指出了这一点,我想知道它是否非常聪明,而不仅仅是非常聪明...:D

标签: knockout.js


【解决方案1】:

每次重新评估dependentObservable 时都会再次跟踪依赖关系。所以,如果你有条件逻辑,那么没有命中的分支不会对依赖有贡献。

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

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

【讨论】:

    【解决方案2】:

    通过它的单个跟踪器变量ko.dependencyDetection 跟踪淘汰赛依赖项。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2020-01-09
      • 2023-03-10
      • 1970-01-01
      • 2021-09-10
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多