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


KnockoutJS具有计算的可观察量的概念,它是依赖于一个或多个可观察量的函数。淘汰赛能够 确定计算的observable的依赖关系,如文档中所述

每当你声明一个计算的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正确地确定了对两者的依赖性 firstName 和 lastName

谁能解释一下怎么样?


3448
2018-04-13 19:25


起源

无法得到问题,我相信计算的observables通过评估所有依赖关系来确定运行时自己的状态,所以所有看起来都清晰明了,抱歉但无法得到你问题的主要观点 - sll
好问题。我一直认为他们在手册中描述的方法就像你引用的那样非常聪明,但是现在你指出这一点,我想知道它是否非常聪明而且不仅仅是非常聪明......:D - Jani Hartikainen


答案:


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

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

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


13
2018-04-13 19:56





在淘汰赛中,依赖性通过它的单个跟踪变量进行跟踪 ko.dependencyDetection

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

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


1
2017-11-02 04:55