Knockout.js js映射插件不调用';创建';或';更新';对象中数组的属性
当一个数组嵌套在一个对象中时,Knockout.js映射插件的“create”和“update”回调不会在人们期望的时候被调用。特别是,调用Knockout.js js映射插件不调用';创建';或';更新';对象中数组的属性,knockout.js,knockout-mapping-plugin,knockout-2.0,Knockout.js,Knockout Mapping Plugin,Knockout 2.0,当一个数组嵌套在一个对象中时,Knockout.js映射插件的“create”和“update”回调不会在人们期望的时候被调用。特别是,调用view\u model.mappedCreate({})会触发回调 下面是一个示例,给出了如下数据结构和映射: var data = { Test: { Items: [ { Name: "Red", Count: 0}, { Name: "Green"} ]
view\u model.mappedCreate({})
会触发回调
下面是一个示例,给出了如下数据结构和映射:
var data = {
Test: {
Items: [
{ Name: "Red", Count: 0},
{ Name: "Green"}
]
},
NewItem: ""
},
counter = 0;
var vm = ko.mapping.fromJS(data, {
Test: {
Items: {
create: function(options) {
options.data.Count = ++counter;
console.log("Data:", options.data);
return ko.mapping.fromJS(options.data);
},
update: function(options) {
options.data.Count = ++counter;
console.log("Data:", options.data);
return ko.mapping.fromJS(options.data);
}
}
}
});
var vm = ko.mapping.fromJS(data, {
Items: {
create: function(options) {
options.data.Count = ++counter;
console.log("Create:", options.data);
return ko.mapping.fromJS(options.data);
},
update: function(options) {
options.data.Count = ++counter;
console.log("Update:", options.data);
return ko.mapping.fromJS(options.data);
}
}
});
从中可以看出,上述的输出是:
{
"Test": {
"Items": [
{
"Name": "Red",
"Count": 0
},
{
"Name": "Green"
}
]
},
"NewItem": ""
}
此外,从不调用console.log
语句
人们期望项
的第二个元素是{“Name”:“Green”,“Count”:1}
(以及要执行的console.log语句)
当项
未嵌套时,它会按预期工作-如中所示
我可能忽略了一些显而易见的东西,但无论如何,如果您能就如何解决此问题提供见解和建议,我将不胜感激。答案似乎是将阵列名称的映射设置为顶级,如下所示:
var data = {
Test: {
Items: [
{ Name: "Red", Count: 0},
{ Name: "Green"}
]
},
NewItem: ""
},
counter = 0;
var vm = ko.mapping.fromJS(data, {
Test: {
Items: {
create: function(options) {
options.data.Count = ++counter;
console.log("Data:", options.data);
return ko.mapping.fromJS(options.data);
},
update: function(options) {
options.data.Count = ++counter;
console.log("Data:", options.data);
return ko.mapping.fromJS(options.data);
}
}
}
});
var vm = ko.mapping.fromJS(data, {
Items: {
create: function(options) {
options.data.Count = ++counter;
console.log("Create:", options.data);
return ko.mapping.fromJS(options.data);
},
update: function(options) {
options.data.Count = ++counter;
console.log("Update:", options.data);
return ko.mapping.fromJS(options.data);
}
}
});
根据
我在其他地方的代码中仍然遇到了一个问题,但显然上面说明的问题并不是这个问题。答案似乎是将数组名称的映射设置为顶级,如下所示:
var data = {
Test: {
Items: [
{ Name: "Red", Count: 0},
{ Name: "Green"}
]
},
NewItem: ""
},
counter = 0;
var vm = ko.mapping.fromJS(data, {
Test: {
Items: {
create: function(options) {
options.data.Count = ++counter;
console.log("Data:", options.data);
return ko.mapping.fromJS(options.data);
},
update: function(options) {
options.data.Count = ++counter;
console.log("Data:", options.data);
return ko.mapping.fromJS(options.data);
}
}
}
});
var vm = ko.mapping.fromJS(data, {
Items: {
create: function(options) {
options.data.Count = ++counter;
console.log("Create:", options.data);
return ko.mapping.fromJS(options.data);
},
update: function(options) {
options.data.Count = ++counter;
console.log("Update:", options.data);
return ko.mapping.fromJS(options.data);
}
}
});
根据
我在其他地方的代码中仍然遇到了一个问题,但显然上面说明的问题不是它