我试图将修改后的viewModel发送回我的服务器。不幸的是,我必须使用 ko.mapping.fromJSON()和一些mappingOptions创建我的viewModel,它工作正常。现在我需要一种简单方式将创建的viewModel转换回原始方案。
我想转换一下:
var myModel = {
simpleProp: "test",
complexProp: {
simpleProp2: "test2",
simpleProp3: "test3"
}
};
进入那个(JS):
var myModel = {
simpleProp: "test",
modifiedToSimpleProWithNewName: "test2"
};
给我这个JSON:
{"simpleProp":"test","modifiedToSimplePropWithNewName": "test2"}
我在想,因为 ko.mapping.toJSON 有一个映射参数,就像为这个方法创建另一个映射一样简单。但似乎ko.mapping实际上忽略了我的自定义属性创建:
var mappingOptions = {
// ignored
'simpleProp': {
create: function (thing) {
return "Changed simpleProps value";
}
},
// working
ignore: ["simpleProp3"]
};
我为你创建了jsFiddle。
请注意:我已经简化了使用fromJSON删除模型生成的示例:
// created and modified by ko.mapping.fromJSON - with custom mapping!
var myModel = {
simpleProp: "test",
complexProp: {
simpleProp2: "test2",
simpleProp3: "test3"
}
};
结果将是:
{"simpleProp":"test","complexProp":{"simpleProp2":"test2"}}
正如您所看到的,忽略选项将被应用,而" simpleProb' / create 将赢得。
非常感谢任何帮助。谢谢!
PS:我知道这种映射不会达到预期的效果。这只是一个" ' simpleProp' 是否会被修改?" -test。
答案 0 :(得分:5)
映射插件toJSON方法将像JSON.stringify函数一样,检查并使用对象上可能存在的任何toJSON方法的返回值,然后将其字符串化为JSON。
因此你可以这样做(updated jsfiddle):
var myModel = {
simpleProp: "test",
complexProp: {
simpleProp2: "test2",
simpleProp3: "test3"
},
toJSON: function () {
return {
simpleProp: this.simpleProp,
complexProp: this.complexProp.simpleProp2
};
}
};
只需将toJSON方法格式设置为您希望它看起来的对象,您就可以了。