10

KnockoutJSのマッピングプラグインで問題が発生しました。次のことを行う必要があります。

  1. オブジェクトのマッピング作成をカスタマイズします
  2. #1からネストされたオブジェクトの配列のマッピング作成をカスタマイズします。

このフィドルの例では、子供たちをカスタム作成に適切にマッピングさせようとしています。期待される結果は、各子追加のdescriptionプロパティがあることです。フィドルから、結果は次のようになります。

  • アダムスミス
  • ボブは5歳です
  • クリスは7歳です

このフィドルの例で、予想される動作を示すことができます。このコードでは、2つのデータセットが必要であり、最初のデータセットには子オブジェクトの空の配列があることに注意してください。次のコード行により、子オブジェクトがカスタマイズされて作成されます。

ko.mapping.fromJS(additionalData, parentMapping, viewModel);

残念ながら、これには空の初期子を持つことと2回のマッピングの両方が必要です。実際のコードははるかに深い階層を持っているため、これは受け入れられません。

上記に加えて、parentMappingに次のコードを追加してみました。

var mapping = { 'ignore': ["children"] };
var innerModel = ko.mapping.fromJS(options.data, mapping);
//for brevity
innerModel.children = ko.mapping.fromJS(options.data.children, childMapping);

これには、初期マッピングで子オブジェクトをマッピングする効果があります。ただし、childrenプロパティの後続のすべてのマッピングは無視されます。

ノックアウトマッピングを使用して親オブジェクトと子オブジェクトの両方の作成をカスタマイズする方法はありますか?

ありがとうございました。

4

1 に答える 1

18

http://jsfiddle.net/5cfa3/23/

var viewModel = {};

var data = {
  id: "1",
  firstName: 'Adam',
  lastName: "Smith",
  children: [ {id: "2", name: "Bob", age: 5}, {id: "3", name: "Chris", age: 7 }]
};

var Parent = function(data){
  ko.mapping.fromJS(data, mapping, this)
};

var mapping = {
  create:function(options){
    var parent = new Parent(options.data);
    parent.fullName = ko.computed(function(){
        return parent.firstName() + " " + parent.lastName();
    });
    return parent;
  },
  'children': {
     create: function(options) {
         options.data.description = ko.computed(function(){
             return options.data.name + " is " + options.data.age + " years old ";
         });
         return ko.mapping.fromJS(options.data);         
     }
   }
};

viewModel = ko.mapping.fromJS(data, mapping);

ko.applyBindings(viewModel);
于 2013-03-20T14:57:04.487 に答える