击倒计算可观察停止射击

时间:2013-04-01 19:27:46

标签: knockout.js

这令人费解。这是一个小提琴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留作不可观察的并且访问一个可观察的财产,那么一切都正常。

所以,我的问题是

  1. 为什么会这样?
  2. 如何重新评估计算的observable?

1 个答案:

答案 0 :(得分:2)

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

如果_editing最初为true,则计算出的observable会立即返回,而不会检测其他observable的依赖关系,因此在这些observable更改时永远不会更新。

要解决此问题,只需使_editing变量可观察,并修复所有内容。