拥有以下型号:
var dataModel = ko.observable({ someProp: ko.observable() });
var isValid = ko.pureComputed(function () {
return dataModel().isValid;
});
我有以下功能:
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()));
}
每当我运行testMe()
dataModel.isValid = false
并执行
console.log(" isValid:" + isValid())
它仍然设置为" true"即使我把它设置为假,但为什么?我让它工作的唯一方法是做
dataModel({isValid:false}); 但是这样我松开了模型中的所有其他属性。我怎样才能做到这一点?
我做错了什么?
答案 0 :(得分:4)
isValid
不是可观察的。计算只会知道更新其中一个可观察量是否已更改。或者,您可以使用dataModel.valueHasMutated()
告诉Knockout dataModel
已更改(这是计算机查看的可观察对象,将导致计算机重新计算)。
我建议使用一个可观察的。尝试这样的事情:
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();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>