【问题标题】:How Knockout computed observable register to the relevant observables?Knockout 如何计算可观察到相关可观察的寄存器?
【发布时间】:2014-12-28 14:27:50
【问题描述】:

当我们在 Knockout 中声明一个计算的 observable 时,我们所要做的就是传递一个函数,该函数将在此函数包含的一个 observable 更新时更新此计算。

示例,来自 Knockout 文档:

function AppViewModel() {
    this.firstName = ko.observable('Bob');
    this.lastName = ko.observable('Smith');

    this.fullName = ko.computed(function() {
        return this.firstName() + " " + this.lastName();
    }, this);
}

我的问题很简单,但我没有找到任何相关信息:计算如何知道传递的函数中包含哪些可观察对象?它会在初始化期间执行一些类似反射的动作来发现它们吗?

我不是 JS 大师,所以也许我遗漏了一些明显的东西,但如果有人能指出一条信息......

【问题讨论】:

    标签: javascript knockout.js computed-observable


    【解决方案1】:

    How dependency tracking works 页面从高层次上描述了在评估依赖(计算)可观察对象时会发生什么。然而,它并没有深入了解它是如何实现的。其实挺有意思的。

    首先,可观察对象和依赖可观察对象。从概念上讲,这些只是保存值的简单函数。 Observables 会保留你给它的值,如果你调用它,它会返回给你。如果在其评估函数中找到的任何其他可观察对象或相关可观察对象被更新,则相关可观察对象将自行更新。

    但是依赖的 observable 是如何真正知道 evaluator 中的这些 observable 和依赖的 observable 的呢?

    在读取可观察对象或依赖可观察对象的值时,您实际上所做的不仅仅是检索该值。在幕后,当获取值时,您还注册了对当前依赖检测框架的依赖。框架是用于跟踪自框架创建以来调用了哪些可观察对象和依赖可观察对象的机制。

    框架是在启用依赖检测时创建的,通常是在评估依赖的可观察值函数时。当依赖的可观察对象依赖于其他可观察对象并且它们是嵌套的时,这些框架当然可以嵌套。当求值函数完成时,框架会被移除。

    这就是它的要点。如果您真的想了解详细信息,请查看debug source

    【讨论】:

      【解决方案2】:

      有一个流行的约定可以避免完全跟踪这一点:如果您的视图模型的构造函数将对 this 的引用复制到不同的变量(传统上称为 self),然后您可以在整个视图模型中使用 self 而不必担心关于它被重新定义以引用其他东西。

      See this link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 2019-09-29
        相关资源
        最近更新 更多