这是一个简单的viewmodel:
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似乎永远不会得到更新。 我在这里做错了什么?
由于
尼古拉斯
答案 0 :(得分: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中工作。无论如何,如果您的视图模型变得复杂(例如具有cumputed属性等),最好使用构造函数作为视图模型。
进一步阅读:Difference between knockout View Models declared as object literals vs functions
答案 1 :(得分: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);
};
或者在创建文字后设置isAllValid函数,但我不认为文字应该用于虚拟机