2013-10-21 7 views
6

वहाँ निम्नलिखित करने का एक तरीका है sexier:बैकबोन कई संग्रह लाने

scheduleSubjects.fetch({ 
    success: function(){ 
     subjectList.fetch({ 
      success: function(){ 
       assignments.fetch({ 
        success: function(){ 
         _this.render(); 
        } 
       }); 
      } 
     }); 
    } 
}); 

मैं इससे पहले कि मैं यह जोड़ तोड़ शुरू सभी डेटा पुनः प्राप्त किया जा करना चाहते हैं।

धन्यवाद।

+4

शेड्यूल बदलें शेड्यूलसब्जेक्ट्स के लिए विषय। ;) –

+2

नेस्टेड कॉल पर माता-पिता कॉल पर निर्भरता है? –

उत्तर

8

JQuery's deferred objects का उपयोग करके आप $.when उपयोग कर सकते हैं एक कॉलबैक ट्रिगर करने के लिए जब कई async कॉल पूरी कर ली है कर रहे हैं:

$.when(scheduleSubjects.fetch(), subjectList.fetch(), assignments.fetch()).then(_this.render); 

ध्यान दें कि यह क्योंकि JQuery.ajax काम करता है , और इसलिए Backbone.fetch, एक स्थगित वस्तु देता है।


.then के लिए एक वैकल्पिक जो आप मूल कॉलबैक के मापदंडों गुजरता .done है, (जो आप ओपी में की जरूरत नहीं है, लेकिन आप कुछ मामलों में हो सकता है):

$.when(scheduleSubjects.fetch(), subjectList.fetch(), assignments.fetch()) 
    .done(function(scheduleSubjects, subjectList, assignments) { 
     _this.render(); 
    }) 
); 
+0

यह समाधान एक आकर्षण की तरह काम करता है। सभी के बाद आपका सबसे अच्छा जवाब बनाया :) –

+0

अच्छा लेकिन हम इस समाधान के साथ लोड प्रगति का ट्रैक कैसे रख सकते हैं? –

0

यह करने का एकमात्र तरीका मैं बैकबोन के bind() और trigger() के साथ कर सकता हूं।

घटनाओं के साथ आप इस कार्यक्षमता को प्राप्त कर सकते हैं .. सुनिश्चित नहीं है कि कोई बेहतर तरीका है या नहीं। एक बार जब आप अपना पहला संग्रह लोड कर लेंगे तो आप दूसरे की लोडिंग को ट्रिगर कर सकते हैं। सिद्धांत रूप में दो संग्रहों को आपके उदाहरण के अनुसार जोड़ा जाना चाहिए। ईवेंट आधारित लोडिंग subjectList और scheduleSubjects को रद्द कर देगा।

2

आप या तो इस्तेमाल कर सकते हैं वादे:

scheduleSubjects.done(function() { 
    subjectList.fetch(); 
}); 
subjectList.done(function() { 
    assignments.fetch(); 
}); 
assignments.done(function() { 
    _this.render(); 
}); 
scheduleSubjects.fetch(); 

या घटना श्रोताओं:

subjectList.listenToOnce(scheduleSubjects, 'sync', subjectList.fetch); 
assignments.listenToOnce(subjectList, 'sync', assignments.fetch); 
this.listenToOnce(assignments, 'sync', this.render); 
scheduleSubjects.fetch(); 

आप एक ऐसा दृश्य के अंदर इन श्रोताओं को परिभाषित करने की जरूरत नहीं है। वे आवेदन स्तर में रह सकते हैं। केवल एक चीज दृश्य के बारे में परवाह है रेंडर करने के लिए है एक बार assignments लाए जाने

7
var collections = [scheduleSubjects, subjectList, assignments]; 
var complete = _.invoke(collections, 'fetch'); 

$.when(null, complete).then(function(){ 
    _this.render(); 
}); 

वादा और अंडरस्कोर _.invoke() का उपयोग करें!

+0

सेक्सी :) बिल्कुल वही जो मैं खोज रहा था! –

+4

'$ .when()' null' का पहला तर्क क्यों है? –

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