2011-08-22 12 views
7

Próbuję uruchomić to, ale walczę z tym. Moja kolekcja kończy się pusta, gdy sprawdzam wywołanie zwrotne success na fetch. Nie daje mi to żadnych wyraźnych błędów podczas parse. Oto mój kod:Jak utworzyć kolekcję z kilkoma typami modeli w pliku backbone.js?

Moja kolekcja:

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; 
       } 
      }); 
     } 
}); 

ten sposób tworzę kolekcji:

griditems = new VOR.Collections.GridItems(); 

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

Kiedy Pocieszam logowaniu msg uzyskać: Object {długość = 0, modele = [0], _byId = {...}, więcej ...}

Zarejestrowałem również funkcję parse w kolekcji i działa ona przez plik JSON po prostu dobrze ... dowolny pomysły na to, co może być nie tak? Długość obiektu msg powinna wynosić 5..i.e. tak wiele razy funkcja parse tworzy pętle i (powinna) dodać model do kolekcji.

Odpowiedz

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; 
}, 

To jest to, co doktor mówi, że powinieneś zrobić w analizie. Cokolwiek zwrócisz, zostanie ustawione jako tablica początkowa kolekcji. To gdzie jest ona wywoływana z:

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

więc proponuję zmienić parse do:

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

będzie lepiej do przechowywania przedmiotów siatki w różnych kolekcjach i owinąć je z modelu podobnego to:

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

miły sposób postępowania jest to, aby na nowo atrybut model, co powiedzieć kolekcję jak dodać nowy model w kolekcji, jak wyjaśniono w tym poście : A Backbone.js Collection of multiple Model subclasses (dzięki @rulfzid, którzy odpowiedzieli na moje pytanie :))

W twoim przypadku, powinieneś być w stanie zdefiniować model przypisuje tak:

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

Dzięki za to! Jest to znacznie lepsze niż wykonanie w 'parsowaniu', ponieważ jest to również przydatne dla danych bootstrapowanych. – philoye

+0

To jest dokładnie to, czego szukałem. Dzięki! –

+0

Myślę, że pierwsza linia powinna być 'var VOR.Collections.GridItems = Backbone.Collection.extend ({' – marcos82

Powiązane problemy