这令人费解。这是一个小提琴http://jsfiddle.net/sujesharukil/TCJjN/1/
我有一个简单的viewmodel,它包含一个计算的observable。如果特定的私有变量_editing设置为true,则计算的observable将返回“”。现在_editing不是一个可观察的。如果_editing为false,则计算的observable将查看observable并返回计算值。
var expressionItem = function(){
this.id = 10;
this.value = ko.observable()
};
var vm = function(){
var textVal = ko.observable(),
_editing = false,
expression = ko.observable(),
displayVal = ko.computed(function(){
if(_editing)
return '';
if(expression() === undefined)
return '';
expression().value(textVal());
return ko.toJSON({Id: expression().id, Value: expression().value()});
}),
edit = function(){
_editing = true;
textVal('enter new value here');
_editing = false;
};
expression(new expressionItem());
return {
textVal: textVal,
displayVal: displayVal,
edit: edit
}
}
ko.applyBindings(vm());
这很好用,直到我将_editing标志设置为false。一旦我这样做,并将其重置为true,计算的observable就不再触发了。
我已经注意到的要点。 1.如果我将_editing作为observable,则所有工作都可以正常工作,因为当observable发生变化时,计算明显会被触发。 2.如果我在检查之前将_editing留作不可观察的并且访问一个可观察的财产,那么一切都正常。
所以,我的问题是
答案 0 :(得分:2)
问题是计算的observable的值取决于_editing
的值。由于_editing
不可观察,因此对值的更改不会反映在计算的observable中。
如果_editing
最初为true
,则计算出的observable会立即返回,而不会检测其他observable的依赖关系,因此在这些observable更改时永远不会更新。
要解决此问题,只需使_editing
变量可观察,并修复所有内容。