2011-08-22 12 views
7

Estoy tratando de hacer que esto funcione, pero lucho con eso. Mi colección termina vacía cuando reviso la devolución de llamada success en fetch. No me da ningún error claro durante parse. Aquí está mi código:¿Cómo crear una colección con varios tipos de modelo en backbone.js?

Mi colección:

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

Es así como se crea la colección:

griditems = new VOR.Collections.GridItems(); 

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

Cuando me consuelo ingrese msg me sale: Object {longitud = 0, los modelos = [0], _byId = {...}, más ...}

También he registrado la función parse en la colección y se ejecuta a través del archivo JSON muy bien ... cualquier ideas sobre lo que podría estar mal aquí? La longitud del objeto msg debe ser 5..i.e. esa es la cantidad de veces que la función parse gira y (debería) agregar un modelo a la colección.

Respuesta

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

Esto es lo que el documento dice que debe hacer en el análisis. Lo que devuelva se establecerá como la matriz de inicio de la colección. Aquí es donde se le llama desde:

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

Así que le sugiero que cambiar su análisis sintáctico a:

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

Será mejor para almacenar los elementos de la cuadrícula en diferentes colecciones y se envuelven con el modelo como esto:

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

una buena manera de manejar esto es redefinido el atributo model, que cuentan la recogida de cómo agregar un nuevo modelo de la colección, como se explica en este post : A Backbone.js Collection of multiple Model subclasses (gracias @rulfzid, que respondió a mi pregunta :))

En su caso, usted debe ser capaz de definir el modelo de atributos de la siguiente manera:

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

Gracias por esto! Esto es mucho mejor que hacerlo en 'parse', porque esto también es para los datos bootstrap. – philoye

+0

Esto es exactamente lo que estaba buscando. ¡Gracias! –

+0

Creo que la primera línea debe ser 'var VOR.Collections.GridItems = Backbone.Collection.extend ({' – marcos82

Cuestiones relacionadas