Javascript 为什么knockout.mapping在某些数据结构上失败?
使用knockout.mapping,我尝试从JSON映射到ko对象。当尝试使用更高级的映射选项解决方案时,我经常得到Javascript 为什么knockout.mapping在某些数据结构上失败?,javascript,knockout.js,knockout-mapping-plugin,Javascript,Knockout.js,Knockout Mapping Plugin,使用knockout.mapping,我尝试从JSON映射到ko对象。当尝试使用更高级的映射选项解决方案时,我经常得到未捕获的TypeError:g不是一个函数。我试图找出问题出在哪里,但我仍然感到困惑 假设我有一个非常简单的模型: var data1 = { // works a: "a", b: [ { b1: "v1" }, { b2: "v2" } ] }; 现在,使用此模型可以很好地工作,如下所示: function viewModel ( dat
未捕获的TypeError:g不是一个函数
。我试图找出问题出在哪里,但我仍然感到困惑
假设我有一个非常简单的模型:
var data1 = { // works
a: "a",
b: [
{ b1: "v1" },
{ b2: "v2" }
]
};
现在,使用此模型可以很好地工作,如下所示:
function viewModel ( data ) {
var self = this;
var a = ko.mapping.fromJS( data, { observe: "a"} );
return a;
}
var vm1 = viewModel( data1 ); // works
我的模型中有两个属性(a
和b
),但我只需要a
就可以观察到,而b
应该只复制到viewmodel
遗憾的是,如果数据结构变得更深入,它的工作就不那么好了:
var data1 = { // works
a: "a",
b: [
{ b1: "v1" },
{ b2: "v2" }
]
};
var data2 = { // Uncaught TypeError: g is not a function
a: "a",
b: [
{ b1: { name: "v1" } },
{ b2: { name: "v2" } }
]
};
var data3 = { // Uncaught TypeError: g is not a function
a: "a",
b1: { name: "v1" },
b2: { name: "v2" }
};
var data4 = { // works
a: "a",
b1: "v1",
b2: "v2"
};
var data5 = { // works
a: "a",
b1: ["1::v1", "2::v1"],
b2: ["1::v2", "2::v2"]
};
function viewModel ( data ) {
var self = this;
var a = ko.mapping.fromJS( data, { observe: "a"} );
return a;
}
var vm1 = viewModel( data1 ); // works
var vm2 = viewModel( data2 ); // Uncaught TypeError: g is not a function
var vm3 = viewModel( data3 ); // Uncaught TypeError: g is not a function
var vm4 = viewModel( data4 ); // works
var vm5 = viewModel( data5 ); // works
复制某些结构有效,而复制其他结构无效,这似乎令人困惑。我理解,当树中的某个地方有多级散列时,问题就出现了
这是我想要的行为还是我做错了什么?为什么复制某些结构可以工作而其他结构不能工作?您是否考虑过定义自定义对象构造?有关详细信息,请参见ko文档中的
该文档中包含了许多选项,用于不同情况下的JSON对象映射 我成功地复制了您提到的问题:
var data1={//works
a:“a”,
b:[
{b1:“v1”},
{b2:“v2”}
]
};
var data2={//Uncaught TypeError:g不是函数
a:“a”,
b:[
{b1:{name:'v1}},
{b2:{name:“v2”}
]
};
函数视图模型(数据){
var self=这个;
var a=ko.mapping.fromJS(数据,{observe:[“a”]});
返回a;
}
var vm1=视图模型(数据1);//作品
var vm2=视图模型(数据2);//未捕获类型错误:g不是函数
谢谢!你的回答是彻底和足够的。我可能不再用头撞墙了。。。