2015-10-10 50 views
0

在ajax獲取請求期間,我們可以使用ko.mapping.fromJS從服務器獲取數據並進行自動映射。另外,我們可以使用ko.mapping.toJS在挖掘中發佈或放置ajax數據到服務器。ajax數據自動映射在ajax投入或發佈在淘汰賽

但是,假定ko.mapping.toJS中的每個值都將在ajax調用中傳回。我們可以使用delete或ignore來刪除不應該傳遞迴服務器的屬性。

最近,我遇到了一個問題如下。我怎麼能傳遞我想要的數據,而沒有明確分配或忽略數據,因爲它太麻煩了。我認爲重構視圖模型可能會完成這項工作,但不知道如何開始。

function MyViewModel() { 
 
    var self = this; 
 
    
 
    // these data should not be pass in ajax call 
 
    self.data1 = ko.observable(); 
 
    self.data2 = ko.observable(); 
 
    self.data3 = ko.observable(); 
 
    ... 
 
    self.data50 = ko.observable(); 
 
    
 
    // these data should not be pass in ajax call 
 
    self.noData1 = ko.observable(); 
 
    ... 
 
    self.noData10 = ko.observable(); 
 
    
 
// these should not be pass in ajax call 
 
    self.function1 = function() { } 
 
    self.function2 = function() { } 
 
    self.function3 = function() { 
 
    $.ajax({ 
 
     .. 
 
     type: 'POST', 
 
     data: { ko.mapping.toJS(self) }, 
 
     success: {} 
 
    } 
 
    ... 
 
    self.function50 = function() {} 
 
}; 
 

 
ko.applyBindings(new MyViewModel());

回答

0

以及有一種技術,我稱之爲分組所需的設定而不干擾2方式結合和其他依賴關係。

視圖模型:

var ViewModel = function (first, last, age) { 
    this.firstName = ko.observable(first); 
    this.include = { // this set you can pass in you ajax call & skip remaining . 
     lastName: ko.observable(last), 
     age: ko.observable(age) 
    } 
}; 
ko.applyBindings(new ViewModel("Planet", "Earth", 25)); 

工作樣本here與預覽顯示完整的一切。

PS:恕我直言,它不是一個明智的方式來改變/重建我們的視圖模型(在複雜的應用程序的可維護性可能是在股份)

+0

您是否建議您展示的方法不是一種明智的方式? – stackdisplay

+0

@stackdisplay至於方法走的路(簡單)。爲了發佈所需的數據(通過ajax POST),構建​​視圖模型以適應這些條款並不是那麼明智(只是意見強硬,它完全適用於您的場景)。 –

1

我這樣做是有點像@super冷靜的方式,但我有DTO是來自/來自服務器的JavaScript對象,但屬性仍然與我的模型相匹配。

//use this for server interaction 
var personFromDto = function(Person) { 
    this.Name = Person.Name; 
    this.Phone = Person.Phone; 
} 
var personToDto = function(Person) { 
    this.Name = Person.Name(); 
    this.Phone = Person.Phone(); 
} 

您可以隨時將其映射到您的可觀察模型表示。

var Person = function(Person) { 
    this.Name = ko.observable(Person.Name); 
    this.Phone = ko.observable(Person.Phone); 
} 

只是衆多方式中的一種,我確信您可以做到這一點。

+0

personFromDto中的Person.Name沒有(),但在personToDto中有()。我怎麼能將personToDto傳遞到var Person = function(Person)中的ajax? – stackdisplay

+0

因爲我們正在從服務器加載數據到一個與我們預期的相匹配的JavaScript模型 –

+0

我在這裏做錯了什麼? http://jsfiddle.net/oqv6fetv/1/ – stackdisplay