2013-12-23 158 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;