2013-12-23 101 views
0

我想知道敲除存储可观察值的位置。例如,我有以下代码:敲除可观察的最新值

var field1 = ko.observable('a'); 
field1(); // prints 'a' 
field1.peek(); // prints 'a' 
field1._latestValue; //prints 'a' 

field1._latestValuu = 'b'; 
field1._latestValue; //prints 'b' 
field1(); // prints 'a' 
field1.peek(); //prints 'a' 

因此不确定Knockout存储值在哪里。我看到peek()的实现并返回_latestValue。但是,即使在手动更改_latestValue之后,在调用peek()时仍然会获得旧值。

我希望在手动设置_latestValue之后,像field1()或field1.peek()这样的调用返回新的值。

我知道订阅者不会被调用,这可能有点棘手,因为_latestValue是一个内部变量,但这对我需要解决的问题很好。

编辑:我想这样做的原因是为计算的observable设置初始值。所以我希望能够修改它的_latestValue,所以当我调用field()或field.peek()时,它会返回手动设置的值,而不是计算的值。我将使一个标志,像这样计算:

var Object1 = function() { 
    self.mode = ko.observable('read-only'); 
    self.calculated = ko.computed({ 
     read: function() { 
      if (self.mode() == 'read-only') { 
       if (self.calculated) 
        return self.calculated._latestValue; 
      } else { 
       // calculation goes here 
      } 
     }, 
     write: function(value) { 
      self.calculated._latestValue = value; 
     } 
    }); 
}; 
var obj1 = new Object1(); 
obj1.calculated('a'); 
obj1.calculated(); // prints 'a' 
obj1.mode('edit'); 
obj1.calculated(); // prints calculated value 

回答

1

有一个叫_latestValue内部变量。在调试版本中,这是从._latestValue的可观察值中暴露出来的。但是,直接设置不会影响内部_latestValue变量。

喜欢:

var a = 1 
this.a = a; 

this.a = 2; 

在此示例中,可变a仍然将是1;