【发布时间】:2014-03-04 21:05:36
【问题描述】:
我有一个简化后看起来像这样的 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 中具有最后一个元素数组作为空对象 ({})。另外两个对象看起来像我想要的那样。
我想我知道为什么。前两个对象的__ko_mapping__.mappedProperties 包含它们最初映射时的所有属性。然而,最后一个有一个空的__ko_mapping__.mappedProperties,因此我猜想没有属性被映射回来。
所以我猜我需要做以下事情之一:
- 将对象添加到
addObjectMember上的数组时,我需要设置__ko_mapping__.mappedProperties以便在保存时映射回来。 - 映射回时,我将映射对象上的所有属性都包含在内,无论它们是否存在于
__ko_mapping__.mappedProperties中。
我不知道如何做任何看起来不像是肮脏的黑客攻击,所以这里的任何帮助都将不胜感激。
【问题讨论】:
-
看来
ko.toJS不会关心最初映射的内容。组合它是否有任何问题,以便我使用ko.mapping.fromJS创建模型,然后使用ko.toJS将其重新转换为 javascript?
标签: javascript knockout.js knockout-mapping-plugin