1

配列がオブジェクト内にネストされている場合、Knockout.jsマッピングプラグインの「create」および「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ステートメントが呼び出されることはありません。

の2番目の要素Items{"Name": "Green", "Count": 1 }(およびconsole.logステートメントが実行される)であることが期待されます。

がネストされていない場合、このjsFiddleItemsでわかるように、期待どおりに機能します。

明らかなことを見落としている可能性がありますが、いずれにせよ、この問題を回避する方法についての洞察と提案に感謝します。

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 に答える