2011-08-22 5 views
7

私はこれを動作させようとしていますが、私はそれに苦労しています。私のコレクションは、fetchsuccessコールバックをチェックすると空になります。それはparseの間に私に明確な誤りを与えません。ここに私のコードは次のとおりです。backbone.jsでいくつかのモデルタイプを持つコレクションを作成するには?

マイコレクション:

VOR.Collections.GridItems = Backbone.Collection.extend({ 
     model : VOR.Models.GridItem, 
     url: "assets/data/grid.json", 
     parse: function(response){ 
      var self = this; 

      _.each(response, function(griditem){ 
       switch(griditem.type){ 
        case "news": 
         self.add(new VOR.Models.NewsGridItem(griditem)); 
         break; 
        default: 
         self.add(new VOR.Models.StandardGridItem(griditem)); 
         break; 
       } 
      }); 
     } 
}); 

これは私がコレクションを作成する方法である:

griditems = new VOR.Collections.GridItems(); 

griditems.fetch({ 
    error: function(e) {console.log(e);}, 
    success: function(msg) { 
     console.log(msg) 
    }); 

私はmsgをログコンソール私が手: オブジェクト{長さ= 0、モデル= [0]、_byId = {...}、more ...}

私はまた、parse関数をコレクションに記録しました。これはJSONファイルを使って実行されます... any何がここで間違っているかもしれないかに関するアイデア? msgオブジェクトの長さは5..i.eでなければなりません。これは関数ループの回数であり、モデルをコレクションに追加する必要があります。

答えて

0
// **parse** converts a response into a list of models to be added to the 
// collection. The default implementation is just to pass it through. 
parse : function(resp) { 
    return resp; 
}, 

これは、あなたが解析する必要があると書いている内容です。あなたが戻すものは、コレクションの開始配列として設定されます。それはから呼び出された場所です。

options.success = function(resp) { 
    collection[options.add ? 'add' : 'refresh'](collection.parse(resp), options); 
    if (success) success(collection, resp); 
    } 

だから、私はあなたのパースを変更することをお勧め:別のコレクションにあなたのグリッドのアイテムを保存する方がよいなどのモデルでそれらをラップする

return _.map(response, function(griditem){ 
    switch(griditem.type){ 
     case "news": 
      return new VOR.Models.NewsGridItem(griditem); 
      break; 
     default: 
      return new VOR.Models.StandardGridItem(griditem); 
      break; 
    } 
}); 
1

この:

var model = Backbone.Model.extend({ 
    url: 'assets/data/grid.json' 
    newsItems: Backbone.Collection.extend({ 
     model: VOR.Models.NewsGridItem 
    }), 
    standartItems: Backbone.Collection.extend({ 
     model: VOR.Models.StandardGridItem 
    }), 

    initialize: function() { 
     this.newsItems = new this.newsItems(); 
     this.standartItems = new this.standartItems(); 

     this.newsItems.bind('all', function() { 
      this.trigger.apply(this, arguments); 
     }, this) 
     this.standartItems.bind('all', function() { 
      this.trigger.apply(this, arguments); 
     }, this) 
    }, 

    parse: function(request) { 
     _.each(response, _.bind(function(griditem) { 
      switch (griditem.type) { 
       case "news": 
        this.newsItems.add(griditem); 
        break; 
       default: 
        this.standartItems.add(griditem); 
        break; 
      } 
     }, this)); 
    } 
}) 

model.fetch() 
18

これを処理する良い方法は、このPOSTで説明したように、コレクションに新モデルを追加するにはどのようにコレクションを伝えるmodel属性を、再定義することです:A Backbone.js Collection of multiple Model subclassesは、あなたのケースでは

(おかげで私の質問に答えた:)誰が、@rulfzid)、あなたはモデルを定義することができるはずです。このように属性:このため

var VOR.Collections.GridItems = Backbone.Collection.extend({ 

    url: "assets/data/grid.json", 

    model: function(attrs, options) { 
    switch(attrs.type) { 
     case "news": 
     return new VOR.Models.NewsGridItem(attrs, options); 
     default: 
     return new VOR.Models.StandardGridItem(attrs, options); 
    } 
    } 

}); 
+0

感謝を!これはブートストラップされたデータのためにも 'parse'で行うよりもはるかに優れています。 – philoye

+0

これはまさに私が探していたものです。ありがとう! –

+0

私は最初の行は 'var VOR.Collections.GridItems = Backbone.Collection.extend({' – marcos82

関連する問題