具有以下模型:
var dataModel = ko.observable({ someProp: ko.observable() });
var isValid = ko.pureComputed(function () {
return dataModel().isValid;
});
Run Code Online (Sandbox Code Playgroud)
我有以下功能:
function testMe() {
dataModel().isValid = false; // This does not work, why?
console.log("isValid: " + isValid()); // Doesn't update, shows old value
dataModel({ isValid: false }); // This works however I loose all other properties
console.log("isValid: " + isValid()); // Prints correctly updated value
console.log(ko.toJSON(dataModel()));
}
Run Code Online (Sandbox Code Playgroud)
每当我运行testMe()
dataModel.isValid = false
并执行
console.log(“ isValid:” + isValid())
即使我在上面将其设置为false,它仍然设置为“ true”。为什么?我让它起作用的唯一方法是做
dataModel({isValid:false}); 但是,通过这种方式,我失去了模型中的所有其他属性。我该如何进行这项工作?
我究竟做错了什么?
isValid不是可观察的。计算对象仅在其可观察项之一已更改的情况下才知道更新。或者,您可以使用来告知Knockout dataModel已更改(这是计算对象所观察到的可观察到的结果,它将导致计算对象重新计算)dataModel.valueHasMutated()。
我还是建议使用可观察的。尝试这样的事情:
var dataModel = ko.observable({
someProp: ko.observable(),
isValid: ko.observable(true)
});
var isValid = ko.pureComputed(function() {
return dataModel().isValid();
});
function testMe() {
console.log("isValid: " + isValid());
dataModel().isValid(false);
console.log("isValid: " + isValid());
console.log(ko.toJSON(dataModel()));
}
testMe();Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>Run Code Online (Sandbox Code Playgroud)