2

这是一个简单的视图模型:

var vm = {
        isValid1: ko.observable(false),
        isValid2: ko.observable(false),
        isValid3: ko.observable(false),
        isValid4: ko.observable(false),

        isAllValid: ko.computed(function() {
            return isValid1() && isValid2() && isValid3() && isValid4();
        });
}

当更新 isValid 并将它们全部设置为 true 时,如下所示:

vm.isValid1(true);
vm.isValid2(true);
vm.isValid3(true);
vm.isValid4(true);

isAllValid 似乎永远不会更新。我在这里做错了什么?

谢谢

尼古拉斯

4

2 回答 2

4

如果您使用对象文字作为视图模型,则需要computed在初始声明之后定义:

var vm = {
        isValid1: ko.observable(false),
        isValid2: ko.observable(false),
        isValid3: ko.observable(false),
        isValid4: ko.observable(false)
}

vm.isAllValid = ko.computed(function() {
   return vm.isValid1() && vm.isValid2() && vm.isValid3() && vm.isValid4();
});

这是必需的,因为对象文字和作用域在 javascript 中的工作方式。无论如何,如果您的视图模型变得复杂(例如具有累积属性等),最好使用构造函数作为您的视图模型

进一步阅读:声明为对象文字与函数的淘汰视图模型之间的区别

于 2013-04-25T09:42:48.340 回答
1

你不能使用这样的文字,你必须创建一个构造函数并像这样启动它

var VM = function() {
        this.isValid1 = ko.observable(false);
        this.isValid2 = ko.observable(false);
        this.isValid3 = ko.observable(false);
        this.isValid4 = ko.observable(false);

        this.isAllValid = ko.computed(function() {
            return this.isValid1() && this.isValid2() && this.isValid3() && this.isValid4();
        }, this);
};

http://jsfiddle.net/FuuQf/

或者在创建文字后设置 isAllValid 函数,但我认为文字不应该用于虚拟机

于 2013-04-25T09:45:27.257 回答