2011-08-22 16 views
7

मैं इसे काम करने की कोशिश कर रहा हूं लेकिन मैं इसके साथ संघर्ष करता हूं। जब मैं पर success कॉलबैक जांचता हूं तो मेरा संग्रह खाली हो जाता है। यह आपको parse के दौरान कोई स्पष्ट त्रुटि नहीं देता है। यहाँ मेरी कोड है:backbone.js में कई मॉडल प्रकारों के साथ संग्रह कैसे बनाएं?

मेरे संग्रह:

griditems = new VOR.Collections.GridItems(); 

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

जब मैं सांत्वना लॉग ऑन msg मैं:

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

यह कैसे मैं संग्रह बनाने है वस्तु {लंबाई = 0, मॉडल = [0], _byId = {...}, और ...}

मैंने संग्रह में parse फ़ंक्शन भी लॉग किया है और यह JSON फ़ाइल के माध्यम से ठीक है ... कोई भी क्या गलत हो सकता है पर विचार? msg ऑब्जेक्ट की लंबाई 5..i.e होना चाहिए। यह कितनी बार parse फ़ंक्शन लूप और (चाहिए) संग्रह में एक मॉडल जोड़ना है।

उत्तर

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

डॉक्टर का कहना है कि आपको पार्स में क्या करना चाहिए। जो भी आप वापस लौटाएंगे संग्रह संग्रह सरणी के रूप में सेट किया जाएगा।

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

यह अलग संग्रह में अपने ग्रिड आइटम की दुकान और उनकी तरह के मॉडल के साथ रैप करने के लिए बेहतर होगा:

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

तो मैं करने के लिए अपने पार्स बदलने के लिए सुझाव है: यह जहां यह कहा जाता है से है इस:

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

इस से निपटने का एक अच्छा तरीका, 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

इस के लिए धन्यवाद! यह 'पार्स' में ऐसा करने से काफी बेहतर है क्योंकि यह बूटस्ट्रैप डेटा के लिए भी है। – philoye

+0

यह वही है जो मैं खोज रहा था। धन्यवाद! –

+0

मुझे लगता है कि पहली पंक्ति 'var VOR.Collections.GridItems = Backbone.Collection.extend ({' – marcos82

संबंधित मुद्दे