Knockout.js 使用敲除映射插件动态更改属性类型

Knockout.js 使用敲除映射插件动态更改属性类型,knockout.js,mapping,knockout-mapping-plugin,Knockout.js,Mapping,Knockout Mapping Plugin,我需要使用knockout映射插件来使用ajax json数据动态更新对象。但是属性类型会发生变化。例如,我收到的json数据如下: {“type”:“A”,“output”:“This is A”} 或 {“类型”:“B”,“输出”:{“名称”:“B”} 或 {“类型”:“C”,“输出”:[“C1”,“C2”,“c3”]} 我在前端有不同的视图模板,可以根据类型显示我的模型。但问题是ko.mapping.fromJS(数据,{},viewmodele)不起作用,因为输出类型是不固定的。如何动态

我需要使用knockout映射插件来使用ajax json数据动态更新对象。但是属性类型会发生变化。例如,我收到的json数据如下:

{“type”:“A”,“output”:“This is A”}

{“类型”:“B”,“输出”:{“名称”:“B”}

{“类型”:“C”,“输出”:[“C1”,“C2”,“c3”]}


我在前端有不同的视图模板,可以根据类型显示我的模型。但问题是ko.mapping.fromJS(数据,{},viewmodele)不起作用,因为输出类型是不固定的。如何动态映射它?

您可以创建多个表示每种类型的javascript对象。 您可以向插件提供自定义映射,在该插件中,您可以控制对象的创建方式(以及对象的创建类型)

大概是这样的:

var mapping = {
create: function(json) {
    if(json.data.Type == 'A'){
        return new YourTypeA();

     }  
     //same for your other types
 }
}

var data = '[{ "Type": "A", "Titel": "Title1", "Description": "Description 1" }, { "Type": "B", "Titel": "Title 2", "Description": "Description 2" }, { "Type": "C", "Titel": "Title     3", "Description": "Description 3"}]';
    ko.mapping.fromJS(eval(data), mapping, viewModel);

希望这有帮助

我自己找到了答案。只需将项目放入数组中,映射就会很好

data = [{"type" : "A", "output" : "This is A" }]
ko.mapping.fromJS(data, {}, viewModle)
data = [{"type" : "B", "output" : {"Name" : "B"}}]
ko.mapping.fromJS(data, {}, viewModle)

是的,你的建议很有效。但是我有20种不同的类型。手动操作很痛苦。在更新数据时,我可以做些什么来删除“output”属性并让knockout自动映射它吗。