2016-01-16 33 views
0

事實證明,我認爲這很難。我有一個ViewModel,我專門用於在我的網格中進行過濾。那就是:刪除淘汰賽視圖的空屬性Model

var GridFiltersViewModel = function() { 
    var self = this; 

    self.search = ko.observable(); 
    self.sortColumn = ko.observable(); 
    self.sortDirectionIsAscending = ko.observable(true); 
    self.page = ko.observable(1); 
    self.pageSize = ko.observable(10); 
    self.pageCount = ko.observable(); 
    self.itemCount = ko.observable(); 
}; 

我面對的問題是,當我對我的操作方法發送此視圖模型的實例,我得到一個錯誤:

The value 'null' is not valid for property

這是因爲我的服務器端ViewModel屬性不接受客戶端ViewModel的nullundefined屬性,即使我將它們設置爲可爲空。讓服務器端ViewModel接受空屬性的唯一方法是根本不發送它們。這是我的嘗試:

var GridFiltersViewModel = function() { 
    // the properties from before 

    self.removeEmptyProperties = function() { 
     for (var property in self) { 
      if (self[property] === null || self[property] === undefined) { 
       delete self[property]; 
      } 
     } 
    }; 
}; 

不用說,它不起作用。目前,當方法結束時,我最終得到一個undefined對象。我也嘗試在運行該方法之前將knockout ViewModel轉換爲JavaScript對象(使用ko.toJS()),但我得到了相同的結果。

我在做什麼錯在這裏,我該怎麼做對不對?

回答

1

我只想構建一個新的JSON對象,並返回,而不是嘗試一些異國情調,如消除性質......是這樣的:在這裏

var GridFiltersViewModel = function() { 
    var self = this; 
    self.prop1 = ko.observable(null); 
    self.prop2 = ko.observable('Test'); 
    self.prop3 = ko.observable(undefined); 
    self.definedProperties = ko.computed(function() { 
     var json = {}; 
     json.props = ""; 
     for (var property in self) { 
      if (self[property]() !== null && self[property]() !== undefined) { 
       json[property] = self[property](); 
       if (json.props !== "") { 
        json.props += ", ";     
       } 
       json.props += property; 
      } 
     } 
     return json; 
    });  
}; 

完整的示例: https://jsfiddle.net/brettwgreen/ehy7cmud/2/

+0

還要注意,雖然,你不是用圓括號拆開你的可觀察的檢查...所以當你檢查self [property]的時候,你會在原始代碼中取回原始函數對象。應該是自己[財產]()。可能是你痛苦的根源。 –

+0

括號不是我的痛苦來源,但沒關係,您的解決方案效果很好! – Alternatex