Knockout.js js映射插件不调用';创建';或';更新';对象中数组的属性

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"} ]

当一个数组嵌套在一个对象中时,Knockout.js映射插件的“create”和“update”回调不会在人们期望的时候被调用。特别是,调用
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);
            }
        }
});
根据

我在其他地方的代码中仍然遇到了一个问题,但显然上面说明的问题不是它