2013-03-08 117 views
0

我有一個問題與挖空計算observable和JSON函數。我創建了一個Fiddle Example。在這個例子中,我有一個模型:問題ko.toJSON和計算可觀察

function VM() 
{ 
    this.Name = ko.observable("Tom"); 
    this.Age = ko.observable(23); 

    //I want this computed evaluate only 
    //when name will change. So i put Name observable 
    //inside it. 
    ko.computed(function(){ 
    this.Name(); 
    //send only after dom is initiallized 
    if(initialized){ 
     Server.Sync(this); 
    } 
    }, this).extend({ throttle: 500 }); 
} 

function Server() 
{ 
} 

Server.Sync = function(data) 
{ 
    alert("send"); 
    var jsonData = ko.toJSON(data); //This is the problamatic code which.. 
    //increases the computed dependency. After executing this code the.. 
    //computed function is now evaluates on Age also which i do not want. 

    //send jsonData 
}; 

在這個模型中,我想我的計算僅評估當用戶將更改名稱觀察特性。其工作正常,直到Server.Sync函數執行完畢。在同步函數我從ViewModel對象創建JSON對象通過toJSON函數和此代碼首先打開observables並比創建它的Clean Js對象比通過Stringify它將創建JSON。現在我認爲在展開觀察數據時,Age可觀察到的依賴性會增加我計算的可觀察值,現在它會在用戶更改Age屬性時進行評估。

如果我的解釋是正確的,我該如何避免這種情況?

+1

年齡是否有可觀察到?看起來你不想觀察這些數據的變化。 – 2013-03-08 18:09:27

回答

2

問題是「this」變量。您正在訪問計算中的主視圖模型。該參考被傳遞,並且當該參數改變時,計算的值現在重新評估。

你最好的辦法就是做這樣的事情。

創建一個本地變量,其中包含要傳遞的數據並通過該數據進行同步。

這裏是從你的小提琴更新的JSBin。我從計算中刪除了這個,並使用一個局部變量來訪問它。

http://jsbin.com/eqejov/9/edit

function VM() 
{ 
    var self = this; 
    self.Name = ko.observable("Tom"); 
    self.Age = ko.observable(23); 

var localValue = { 
    Name: self.Name(), 
    Age: self.Age() 
}; 

    //I want this computed evaluate only 
    //when name will change. So i put Name observable 
    //inside it. 
    ko.computed(function(){ 
     self.Name(); 
     //send only after dom is initiallized 
     if(initialized){ 
      Server.Sync(localVariable); 
     } 
    }).extend({ throttle: 500 }); 
    } 
+0

順便說一句,這不會給你最新的價值。 – 2013-03-08 21:34:30