2011-09-02 7 views
25

モデル内のコレクションをネストすることは可能ですか?バックボーン - モデルネストされたコレクション

私はモデルの初期化コールバックで新しいコレクションを作成し、コレクションと親モデル間を行き来できる参照を作成できることを知っています。しかし、それはエクスポートJSONは次のようになりますよう、モデルの一部として、コレクションを設定することが可能である:

{ 
    blah: 'blah', 
    myCollection: [ 
     { 
     foo: 'asdf', 
     bar: 'qwer' 
     }, 
     { 
     foo: 'asdf123', 
     bar: 'qwer123' 
     } 
    ] 
} 

ない場合は、どのようにバックエンドに関連したコレクションでモデルを同期ハンドルのですか?バックボーンの同期を利用してJSONをリビルドする必要がありますか、それとももっとシームレスなものがありますか?

申し訳ありませんが、この質問は別の場所で回答されています。私は周りを見回し、いくつかの回避策を見たが、私が探しているものに本当に答えるものは何もない。

答えて

30

2つのアプローチがあります。最初は、すべてを取得するルートモデルを定義することです。ネストされた属性のサブコレクションとサブモデルを作成するには、parse()メソッドをオーバーライドし、サーバーに保存するのに適したJSON構造に変換するにはtoJSON()メソッドをオーバーライドします。

これは、小さなサブコレクションでは完全に受け入れられます。プログラミングには少し時間がかかりますが、Backboneのソースコードを読むことができれば、その方法ははっきりとは分かりませんが、少なくとも理解できるものでなければなりません。

またはBackbone Relationalを使用すると、すべての作業ができます。

7

Renatoは近くでしたが、「持っている」と「セット」はまだ利用できません。私は、Reckonerがそれの一部を指摘したと思います。また、レスポンスからプロパティを削除する必要があります。そうしないと、デフォルト値が上書きされます。

_.extend(Backbone.Model.prototype, { 
    parse: function(resp, xhr) { 
     var attr, model, models, collection, options; 
     for (var prop in resp) { 
      if (this.defaults && this.defaults[prop]) { 
       attr = this.defaults[prop]; 
       if (attr instanceof Backbone.Model) { 
        model = attr.clone(); 
        model.set(resp[prop]); 
        resp[prop] = model; 
       } else if (attr instanceof Backbone.Collection) { 
        models = attr.map(function (model) { return model.clone(); }); 
        options = _.clone(attr.options); 
        collection = new attr.constructor(models, options); 
        collection.add(resp[prop]); 
        resp[prop] = collection; 
       } 
      } 
     } 
     return resp; 
    } 
}); 

誰かを助ける希望。

関連する問題