2011-05-19 29 views
6

Çeşitli Backbone JS modellerinden birini (Backbone.Model'den gelen HistoryItem'ten itibaren) içerebilen History adında bir BackboneJS koleksiyonum var, bu yeniden oluşturulduğunda bir yol bulmaya çalışıyorum. yükleme, ne yazık ki BackboneJS koleksiyonu sadece belirli bir modelde belirtebilir Gerçekten yapmanız gerekenBackbone.Js Özel Tipler Koleksiyonu

HistoryCollection = Backbone.Model.extend({ 
    model: app.models.HistoryItem 
}) 

burada, türü başına Bunu belirlemek olduğunu bunu uygulamak için ben çatal Omurga önce

HistoryCollection = Backbone.Model.extend({ 
    model: function(item) { 
     return app.models[item.type]; } }) 

bir fikir yapmak istiyorum nedir? (yani, bir fonksiyon modelinin bir fonksiyon alabilmesi)

cevap

7

Firebug'da oyun oynamak ... modeli belirtmek yerine toplama yöntemini geçersiz kılabileceğiniz bir yaklaşımla ortaya çıktı. Ancak gerçekte farklı bir yöntemi geçersiz kılmak gerekir,

var BaseModel = Backbone.Model.extend({ 
    meth: function(){ return 'Base method'; }, 
}); 

var SubModel = BaseModel.extend({ 
    meth: function(){ return 'Sub1 method'; } 
}); 

var SubModel2 = BaseModel.extend({ 
    meth: function(){ return 'Sub2 method'; } 
}); 

var ModelCollection = Backbone.Collection.extend({ 
    parse: function(data){ 
     var self = this; 
     data.forEach(function(item){ 
      switch(item.type){ 
      case 1: 
       self.add(new SubModel(data)); 
       break; 
      case 2: 
       self.add(new SubModel2(data)); 
       break; 
      default: 
       self.add(new BaseModel(data)) 
     } 
}); 
    } 
}); 

//Example Use 
x = new ModelCollection; 
x.parse([{type: 1},{type: 2}, {type: 99}]); 
x.map(function(e){ return e.meth();}); 
+0

teşekkür ederiz. Başka bir soruda karşılaştığım bir sorunu çözmeme yardımcı oldu (http://stackoverflow.com/questions/7140741/backbone-js-model-with-collection). Ayrıştırma işlevini kullanmak için bana hiç olmadı. –

0

Sadece bu özelliği uygulamaya ve Jake Dempsey'in tavsiye ile başladı ettik: Sizin ayrıştırma uygulaması temelde istediğiniz modelleri ile koleksiyon doldurmak için basit bir fabrika haline gelir koleksiyon. Omurga yükseltirken şey akılda tutulması gereken bu yüzden özel (imsi) yöntemi olduğunu

var MyCollection = Backbone.Collection.extend({ 

    _prepareModel: function(model, options) { 
     if (!(model instanceof Backbone.Model)) { 
      var attrs = model; 

      switch (attrs.type) { 
       case 1 : 
        model = new ModelType1(attrs, { collection: this }); 
        break; 

       case 2 : 
        model = new ModelType2(attrs, { collection: this }); 
        break; 

       default : 
        model = new BaseModel(attrs, { collection: this }); 
        break; 
      } 

      if (model.validate && !model._performValidation(attrs, options)) model = false; 
     } else if (!model.collection) { 
      model.collection = this; 
     } 

     return model; 
    } 

}); 

Not: Bu kullandığım koddur.

4

IMHO, ben koleksiyonunda modeli yöntemi ile oynamayı tercih:

var MyCollection = Backbone.Collection.extend({ 
    model : function(attrs, options){ 
    switch (attrs.type) { 
      case 1 : 
       model = new ModelType1(attrs, options); 
       break; 

      case 2 : 
       model = new ModelType2(attrs, options); 
       break; 

      default : 
       model = new BaseModel(attrs, options); 
       break; 
    } 
    } 
}); 

veya bir proxy modeli kullanılarak: Bunun

ProxyModel = Backbone.Model.extend({ 
initialize: function() { 
    switch (this.get('type')) { 
    case 1 : 
     model = new ModelType1(attrs, options); 
     break; 

    case 2 : 
     model = new ModelType2(attrs, options); 
     break; 

    default : 
     model = new BaseModel(attrs, options); 
     break; 
    } 
    return new model; 
} 
}) 


var MyCollection = Backbone.Collection.extend({ 
    model : ProxyModel, 
});