2011-05-19 16 views
6

मेरे पास एक बैकबोनजेएस संग्रह है जिसे इतिहास कहा जाता है जिसमें कई बैकबोन जेएस मॉडल (जो इतिहास इटैम से विस्तारित है जो बैकबोन.मोडेल से फैला हुआ है) में से एक हो सकता है, मैं इसे फिर से बनाने के लिए एक रास्ता खोजने की कोशिश कर रहा हूं लोड हो रहा है, दुर्भाग्यवश ऐसा लगता है कि बैकबोनजेएस संग्रह केवल विशेष मॉडल जैसे निर्दिष्ट कर सकता हैविशिष्ट प्रकार के साथ बैकबोन.जेएस संग्रह

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

क्या मैं सच में करने की ज़रूरत है, प्रकार के अनुसार इससे यह निर्धारित किया है यहाँ मुझे लगता है मैं कांटा बैकबोन से पहले

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

कोई भी विचार करने के लिए इस लागू करना चाहते हैं क्या है? (यानी एक संग्रह मॉडल विशेषता एक समारोह लेने में सक्षम है)

उत्तर

7

फायरबग में चारों ओर बजाना .. एक दृष्टिकोण के साथ आया जहां आप मॉडल निर्दिष्ट करने के बजाय संग्रह की पार्स विधि को ओवरराइड कर सकते हैं। आपका पार्स कार्यान्वयन मूल रूप से मॉडल के साथ संग्रह को भरने के लिए एक सरल कारखाने हो जाता है कि आप चाहते हैं:

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

इस के लिए धन्यवाद। इससे मुझे किसी अन्य प्रश्न में एक समस्या हल करने में मदद मिली (http://stackoverflow.com/questions/7140741/backbone-js-model-with-collection)। पार्स फ़ंक्शन का उपयोग करने के लिए मेरे साथ कभी नहीं हुआ .... –

0

मैं सिर्फ इस सुविधा को लागू और जेक डेम्पसे की सलाह के साथ बंद शुरू कर दिया है, फिर भी आप वास्तव में एक अलग पद्धति को ओवरराइड करने की जरूरत है संग्रह।

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

}); 

नोट यह एक निजी (ish) विधि यह है कि जब रीढ़ उन्नयन तो कुछ को ध्यान में रखना: इस कोड मैं प्रयोग किया जाता है।

4

IMHO, मैं संग्रह में मॉडल विधि के साथ खेलने के लिए पसंद करते हैं:

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

या किसी प्रॉक्सी मॉडल का उपयोग:

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, 
}); 
संबंधित मुद्दे