如果数组嵌套在对象中,则不会调用 Knockout.js 映射插件的“创建”和“更新”回调。特别是,人们会期望调用view_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);
            }
        }
    }
});
从这个 jsFiddle可以看出,上面的输出是:
{
  "Test": {
    "Items": [
      {
        "Name": "Red",
        "Count": 0
      },
      {
        "Name": "Green"
      }
    ]
  },
  "NewItem": ""
}
此外,这些console.log语句永远不会被调用。
人们会期望的第二个元素Items是{"Name": "Green", "Count": 1 }(并且执行 console.log 语句)。
当Items没有嵌套时,它按预期工作 - 正如您在这个 jsFiddle中看到的那样。
我可能忽略了一些明显的事情,但无论如何我都会感谢有关如何解决这个问题的见解和建议。