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



如果数组嵌套在对象中的'创建''''''''''''''''和'update'回调。JS映射插件的''和'update'回调。特别是,人们希望调用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中所看到的。

我有可能忽略了一些明显的东西,但是无论如何,我都会感谢您对如何解决这个问题的洞察力和建议。

答案似乎是使数组名称的映射上级映射,因此:

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);
            }
        }
});

根据此JSFIDDLE。

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

最新更新