javascript - 在 Knockout JS 中具有揭示原型(prototype)模式的计算可观察量

标签 javascript jquery knockout.js

我有一个使用揭示模块模式和原型(prototype)的项目。这对帮助我使用 Knockout JS 管理大量 Javascript 代码非常有用。这对于标准可观察对象和 Action 等来说是直截了当的。但是当我开始创建一个计算可观察对象时,我似乎无法让它工作。

我读过这篇文章: Difference between knockout View Models declared as object literals vs functions

这似乎准确地描述了我想要的,因为我正在使用对象文字。但是我似乎无法正确实现它。

这是 HTML:

<div data-bind="with: MyForm">
    <p>First Name: <span data-bind="text: formValues.FirstName"></span></p> 
    <p>Last Name: <span data-bind="text: formValues.LastName"></span></p>
    <p>Full Name: <span data-bind="text: formValues.FullName"></span></p>   
</div>

这是 Javascript:

window.Test = window.Test || {};

Test.Main = function () {
    this.viewModel = {};
    this.setupViewModel();

    return {
        viewModel: this.viewModel

    };
};
Test.Main.prototype.setupViewModel = function () {
    var viewModel = function () {
        var vm = this;

        this.MyForm = {
            formValues: {
                FirstName: ko.observable("Joe"),
                LastName: ko.observable("Bloggs")
            }
         }
    };

    /*
    viewModel.MyForm.formValues.FullName = ko.computed(function() {
        return this.FirstName() + " " + this.LastName();
    }, vieModel.MyForm.formValues);
    */
    this.viewModel = new viewModel();
    ko.applyBindings(this.viewModel);

    return this;
}

var mainApplication = new Test.Main();

我在下面创建了一个简单的 JsFiddle 来说明这段代码: http://jsfiddle.net/dontbesorry80/2Ltb790z/

我已经注释掉了我认为的解决方案,因为它不起作用。非常感谢任何有助于调整此 jsFiddle 工作(正确显示全名)的帮助。

最佳答案

这段代码似乎可以正常工作。

Test.Main.prototype.setupViewModel = function () {
    var viewModel = function () {
        var vm = this;

        this.MyForm = {
            formValues: {
                FirstName: ko.observable("Joe"),
                LastName: ko.observable("Bloggs")
            }
         }
    };

    this.viewModel = new viewModel();

    this.viewModel.MyForm.formValues.FullName = ko.computed(function() {
        return this.FirstName() + " " + this.LastName();
    }, this.viewModel.MyForm.formValues);

    ko.applyBindings(this.viewModel);

    return this;
}

不是将 FullName 属性附加到构造函数,而是必须先创建 viewModel,然后将计算变量附加到它。

this 的使用对于在计算函数内获得适当的作用域至关重要。

在引用的 SO 答案中,您可以看到完全相同的场景:

var viewModel = {
   first: ko.observable("Bob"),
   last: ko.observable("Smith"),
};

viewModel.full = ko.computed(function() {
   return this.first() + " " + this.last();
}, viewModel);

首先 - 使用 first 和 last 属性创建 viewModel,然后 - 将属性 full 添加到 viewModel 对象。

希望这对您有所帮助。

关于javascript - 在 Knockout JS 中具有揭示原型(prototype)模式的计算可观察量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31290261/

相关文章:

javascript - 同步检查子进程是否未能在 Node 中生成?

javascript - ComputeDistanceBetween 返回 NaN 而不是距离

javascript - jQuery 实用函数是否优于普通函数定义?

javascript - 如何在另一个函数中调用一个jquery函数

javascript - 正则表达式将字符串计数与通配符匹配

javascript - jQuery UI slider - 防止多个 handle 重叠

javascript - javascript 或 jquery 中的 nth-child 等效项

javascript - chrome 打包的应用程序不允许在 knockout.js 中进行不安全评估

javascript - KnockoutJS 绑定(bind)未使用可观察集合进行更新

javascript - 计算返回一个排序的 observableArray