1

如果数组嵌套在对象中,则不会调用 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中看到的那样。

我可能忽略了一些明显的事情,但无论如何我都会感谢有关如何解决这个问题的见解和建议。

4

1 回答 1

1

答案似乎是使数组名称的映射成为顶级,如下所示:

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

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

于 2012-11-09T21:53:38.700 回答