2013-07-15 78 views
1

我有一個簡單MVC模式是這樣的:敲除簡單對象映射

public class User 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MobileNumber { get; set; } 
    public string EmailAddress { get; set; } 
} 

我想這種類型的敲除視圖模型內的一個目的映射以便填充它:

var UserViewModel = function() { 
    var self = this; 
    self.user = ko.mapping.fromJS({}); 
    $.getJSON("/UserManagement/CreateEmptyUser", function (data) { 
     ko.mapping.fromJS(data, self.user); 
    }); 
    self.createUser = function (data, eventArgs) { 
     var user = data; 
     $.ajax({ 
      type: "post", 
      contentType: "application/json", 
      data: ko.toJSON(user), 
      url: "@Url.Action("CreateUser")", 
      success: function() { 
       window.location = "@Url.Action("AddNew")"; 
      } 
     }); 
    }; 
}; 

我遇到的問題是我不知道如何映射任何單個對象。我已經使用

self.user = ko.mapping.fromJS([]); 
$.getJSON("/UserManagement/CreateEmptyUser", function (data) { 
     ko.mapping.fromJS(data,{}, self.user); 
    }); 
正在使用數組

,並試圖在索引0中提取元素試過,我以爲會合作的其他解決方案是一個在第二註釋塊。我在google上找到的所有東西都讓我映射整個數組,但沒有涉及簡單的對象映射。有沒有適當的方法來做到這一點?我想保持模型分離,而不是在javascript中手動描述它的屬性。

謝謝, 亞歷克斯·巴拉克

回答

3

我覺得你的問題是,您使用的方法映射來實例化您的視圖模型,這將給它沒有屬性,所以當你嘗試你的JSON後的數據映射調用,self.user沒有屬性來填充。無論你想在那裏的屬性創建用戶對象,或者使用mapping.fromJS擺在首位,以創建視圖模型:

self.user = { FirstName: ko.observable(''), etc... } 

,並留下您的映射行,因爲它是,或

self.user; 
$.getJSON("/UserManagement/CreateEmptyUser", function (data) { 
    self.user = ko.mapping.fromJS(data); 
} 
+0

感謝您的建議。我已經嘗試了第二種方法,但在調用'$ .getJSON'方法後,'self.user'仍然未定義。我嘗試過設置'self.user = null;',但是在調用之後該值仍爲'null'。我想唯一剩下的就是手動映射屬性。 –

+0

我通常使用第一種方法,說實話,因爲我可以在頁面加載時立即應用綁定,這在您不想單獨綁定子視圖模型時非常有用。您可以嘗試將一個空映射也傳遞給映射:ko.mapping.fromJS(data,{});並看看是否有效。 –

+0

它與第一種方法,謝謝:) –

0

我一直在努力工作,並檢查了這一點,並在一開始就找到了我想要的解決方案。這個想法是使用@保羅Manzotti的建議,

self.user; 
$.getJSON("/UserManagement/CreateEmptyUser", function (data) { 
    self.user = ko.mapping.fromJS(data); 
} 

ko.mapping.fromJS(data,{},self.user); 

更換self.user;self.user={};

self.user = ko.mapping.fromJS(data) 

如果用這個,沒有必要手動在viewmodel中聲明每個對象的屬性。希望這對那些偶然發現同樣問題的人有用。

0

如果你的viewModel本身需要是一個observable,那麼我發現使用映射返回一個可觀察數組,如OP所述,然後返回該數組中的第一個項目。這對於在ajax中返回一個您希望推送到現有observableArray中的對象也很有用。 我對此有一個輔助函數:

koMappingUsingArray = function (jsObject, mapping) { 
    var observableObjectArray = ko.observableArray(); 
    var objectArray = new Array(jsObject); 
    ko.mapping.fromJS(objectArray, mapping, observableObjectArray); 

    return observableObjectArray()[0]; 
}; 

然後調用它,如:

self.myObject = ko.observable(); 

    $.ajax({ 
     type: "POST", 
     url: "....", 
     data: ko.mapping.toJSON(???), 
     contentType: "application/json; charset=utf-8", 
     success: function (returnedObject) { 
      self.myObject (koMappingUsingArray(returnedObject)); 
     });