1

这令人费解。这是一个小提琴http://jsfiddle.net/sujesharukil/TCJjN/1/

我有一个简单的视图模型,它包含一个计算的 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 设置为可观察的,那么所有工作都可以正常工作,因为当可观察的发生变化时,显然会触发计算。2. 如果我将 _editing 保留为不可观察并在我检查之前访问可观察属性,那么一切正常。

所以,我的问题是

  1. 为什么会有这种行为?
  2. 计算出的 observable 如何被重新评估?
4

1 回答 1

2

问题是计算出的 observable 的值取决于 的值_editing。由于_editing不可观察,因此对值的更改不会反映在计算的可观察对象中。

如果_editing最初是true,则计算出的 observable 立即返回,而不会检测到对其他 observable 的依赖关系,因此当这些 observable 发生变化时永远不会更新。

要解决这个问题,只需使_editing变量可观察并且应该解决所有问题。

于 2013-04-01T19:32:15.947 回答