2013-03-12 107 views
3

我只是想知道如何從淘汰賽中刪除一個屬性viewModel。具體來說,計算一個。我有一個簡單viewModel從淘汰賽viewmodel刪除屬性

function viewModel(){ 
    var self = this; 
    self.name = ko.observable("John"); 
    self.lastname = ko.observable("Doe"); 
    self.age = ko.observable("22"); 
    self.fullName = ko.computed(function(){ 
     return self.name() + self.lastname(); 
    }); 
    self.fullNameAndAge = ko.computed(function(){ 
     return self.name() + self.lastname() + ': ' + self.age(); 
    }); 
}; 

的數據將被髮送到服務器,但我想排除從viewModel計算的數據。

我認爲像這樣會得到所有計算的數據並將其刪除,但沒有發現任何類似的東西。

 for (observableKey in viewModel) { 
     if (ko.isComputed(viewModel[observableKey]) 
       { 
      delete viewModel[observableKey]; 
     } 
    } 

回答

3

敲除可以返回一個常規的對象,然後你可以刪除任何你想要的東西。

var plainJs = ko.toJS(viewModel); 
delete plainJs.fullName; 

記錄在案的here

+2

我發現這種方法,但我想刪除viewmodel中包含的所有計算,而無需逐個寫入它們。 – Overmachine 2013-03-12 19:07:35

+1

@Overmachine你可以做到這一點,檢查我更新的答案中的小提琴 – gaurav 2013-03-13 03:03:59

2

你可以通過這樣的鍵循環:

for (var key in obj) { 
    if(ko.isComputed(obj[key])) 
    { 
     delete obj[key]; 
    } 
} 

編輯

Here is a working fiddle在按鈕上。在小提琴點擊查看控制檯,那麼你可以看到2個對象,首先一個是在去除計算的可觀測量之前,第二個是去除計算的可觀測量之後。

0

我對這類問題的首選方法是爲您的JSON調用需要創建特定的傳輸對象。

var userSaveRequest = function(data) { 
    var self = this; 
    self.name = data.name; 
    self.lastname = data.lastname; 
    // etc, etc 
} 

然後,從我的調用代碼中,像這樣獲取JSON。

// inside viewModel 
self.saveUser = function(){ 
    var queryData = ko.mapping.toJSON(
    new userSaveRequest(ko.mapping.toJS(self)) 
); 

    // use querydata in AJAX 
} 

此外,它是值得記住的是多麼靈活的Javascript是。如果需要,您可以隨時創建自己設計的對象。

var queryData = ko.mapping.toJSON(
    { 
    name: self.name(), 
    lastname: self.lastname() 
    } 
);