13

そのようなjson設定があるとします:

{
  page:1,   
  items:[
    {  
      name: 'item1', 
      id:1
    }, 
    {
      name: 'item1', 
      id:2
    }, 
    {
      name: 'item1', 
      id:3
    }
  ] 
}

そして、そのようなモデリング:

var Item = Backbone.Model.extend({
    defaults: {name:  "No name"}
});

var ItemCollection = Backbone.Collection.extend({
    model: Item,
    url: '/some/ajax/url',
});

この json をフェッチした後、アイテム セットを ItemCollection のコレクションとしてマップし、ページ番号を属性としてコレクションに追加するにはどうすればよいですか?

4

2 に答える 2

26

@asawyer が述べたように、parse メソッドをオーバーライドする必要がありますが、実際に各アイテムをインスタンス化する必要はありません。アイテムの配列を返す場合は、バックボーンがそれを実行できます。

collection.parseのドキュメントを参照してください

解析する collection.parse(response)

parse は、コレクションのモデルがサーバーによってフェッチで返されるたびに、Backbone によって呼び出されます。この関数には生の応答オブジェクトが渡され、コレクションに追加されるモデル属性の配列を返す必要があります。

あなたのコードは次のように書くことができます

var ItemCollection = Backbone.Collection.extend({
    model: Item,
    url: '/some/ajax/url',

    parse: function(data) {
        this.page=data.page;
        return data.items;
    }
});
于 2012-04-05T10:53:09.503 に答える
2

解析をオーバーライドする必要があります

最終的には次のようになります。

class Item extends Backbone.Model
    defaults:
        name: "No name"

class ItemCollection extends Backbone.Collection
    model: Item
    url: '/some/ajax/url'
    parse: (data) ->
        items = []
        _.each data, (item) ->
            newItem = new Item
                id: item.id
                name: item.name
            items.push newitem
        items

(Coffeescript ですが、そのままの JavaScript に変換するのは簡単です)

他のオプションは、次の場所にあるリレーショナル プラグインです。

https://github.com/PaulUithol/Backbone-relational

私はそれを使用したことはありませんが、解析マッピングを行うことになっていると思います。

于 2012-04-04T22:37:53.253 に答える