Javascript 为什么knockout.mapping在某些数据结构上失败?

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

使用knockout.mapping,我尝试从JSON映射到ko对象。当尝试使用更高级的映射选项解决方案时,我经常得到
未捕获的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不是函数

谢谢!你的回答是彻底和足够的。我可能不再用头撞墙了。。。