我有一个viewModel,在简化时看起来像这样:
var viewModel = function(){
var self = this;
self.selectedObject = ko.observable({});
self.getUnit = function(){
//get the selected object from the server side as json
self.selectedObject(ko.mapping.fromJS(data,mapping));
};
self.addObjectMember = function(){
self.selectedObject().objectMembers.push(new ObjectMemberViewModel(null, self.selectedObject()));
self.save = function(){
var data = ko.mapping.toJS(self.selectedObject);
//ship data to server
}
从服务器收到的数据包含一个名为objectMembers
的数组,其中包含一些属性。不同对象之间的属性可能不同。
我的映射对象如下所示:
var mapping = {
'objectMembers': {
create: function(options){
return new ObjectMemberViewModel(options.data, options.parent);
}
}
};
要查看我的问题,我会举个例子:
用户加载页面,然后提取对象。该对象包含objectMembers
数组中的两个元素。然后使用ko.mapping.fromJS映射这些,一切正常。我可以使用我的模型修改我的viewModel并更新viewModel。然后用户单击触发addObjectMember
函数的按钮,向observableArray添加第三个条目。我也可以与此进行交互,并且可以在viewModel中按预期看到对我的模型所做的任何更改。
单击“保存”时出现问题。如果我调试save方法,并检查self.selectedObject的内容,我可以看到它包含我想要的内容,但映射回变量data
的对象具有objectsMembers
中的最后一个元素{1}}数组作为空对象({}
)。另外两个对象看起来像我想要的那样。
我想我知道为什么。第一个对象的__ko_mapping__.mappedProperties
包含了最初映射时所具有的所有属性。但是最后一个有一个空__ko_mapping__.mappedProperties
,因此我猜没有映射回属性。
所以我想做其中一件事我想:
addObjectMember
上的数组时,我需要设置__ko_mapping__.mappedProperties
,以便在保存时将其映射回来。__ko_mapping__.mappedProperties
内。我不知道如何做任何不像脏兮兮的黑客,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
我最终使用的是ko.toJS
而不是ko.mapping.toJS
。 ko.toJS
不关心__ko_mapping__
,并映射所有内容(包括__ko_mapping__
)。
这意味着它的映射比我需要的多一点,但除此之外它工作正常。