2013-04-01 26 views
1

这是令人费解的。这里是一个小提琴http://jsfiddle.net/sujesharukil/TCJjN/1/淘汰赛计算可观察停止射击

我有一个简单的viewmodel,它包含一个计算observable。如果一个特定的私有变量_editing被设置为true,那么被计算的observable将返回“”。现在_editing不是可观察的。如果_editing是假的,那么计算出的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。一旦我这样做,并将其重置为真,计算的观察值不再触发。

点我注意到了。 1.如果我将_editing设置为observable,则所有工作都正常,因为计算结果显然会在observable发生更改时触发。 2.如果我离开_editing作为非可观察的并且在我的检查之前访问一个可观察的属性,所有工作都可以正常工作。

所以,我的问题是

  1. 为什么这种行为?
  2. 计算得到的观测值如何得到重新评估?

回答

2

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

如果_editing最初true,所计算的观察到立即返回而不检测在另一可观测量的依赖关系,因此永远不会更新时,这些可观察量的变化。

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

+0

杰夫,_editing最初是错误的。计算的工作很好,直到我把它设置为true时。我的问题是如何重新计算观察值?由于_editing不是可观察的,所以计算结果应该完全不取决于其值的变化。看看小提琴。我认为你没有回答我的问题。不过谢谢。 –

+0

没错。正如我所说的,'_editing'不可观察,但您可以在编辑功能中更改它的值。通过设置'textVal'值,依赖关系会触发计算的observable的更新。因为在那一刻'_editing'是真的,它立即返回''''并且没有检测到其他依赖关系。你改回'_editing'但由于它不可观察,所以计算不会更新。使'_editing'可观察。 [更新的小提琴](http://jsfiddle.net/jeff1203/TCJjN/2/) –