2011-03-10 10 views
68

मेरे backbone.js ऐप में, Trips collection है जिसमें Trip models है, जो LocalStorage के साथ काम कर रहा है। मैं Todos store की यात्रा बनाने और सहेजने के लिए Trips.create(form_attributes) पर कॉल करने में सक्षम हूं।Backbone.js संग्रह पर fetch() को कॉल करते समय कौन सी घटनाएं ट्रिगर होती हैं?

जब मैं पहली बार मेरे एप्लिकेशन लोड करते हैं, मैं Trips.fetch({ success: trips_fetch_success }) कहते हैं, और trips_fetch_success एक प्रतिक्रिया है कि पता चलता Trip models कि Trips collection रखती है प्राप्त करता है।

मैं Trips collection को refresh और change घटनाओं बाध्य करने की कोशिश की है, लेकिन इन घटनाओं पकड़े जाने नहीं कर रहे हैं, मुझे विश्वास है कि मैं बनाने गलत विचार है जो घटनाओं Trips.fetch ट्रिगर के बारे में।

मेरा प्रश्न: कौन सी घटनाओं को Trips.fetch ट्रिगर करना चाहिए? और क्या घटनाएं संग्रह पर या प्रत्येक व्यक्ति Trip models पर ट्रिगर की गईं?

उत्तर

59

Collection.fetch() सफलता पर reset पर कॉल करेगा, जो बदले में 'रीसेट' ईवेंट ट्रिगर करेगा। संग्रह रीसेट ईवेंट के किसी भी ग्राहक को ईवेंट प्राप्त करना चाहिए।

यहां कुंजी "सफलता पर" है। मुझे यह समस्या थी, केवल यह पता लगाने के लिए कि रीढ़ की हड्डी चुपचाप मेरे त्रुटियों के संदेशों को निगल रही थी। कि, कम से कम, console.log() के लिए लॉग एक त्रुटि हैंडलर में दर्रा, और देखो क्या हो रहा है:

trips.fetch({error: function() { console.log(arguments); }}); 

(नोट: backbone.js के पुराने संस्करण को गति प्रदान करेगा बजाय "रीसेट" के "ताज़ा")

+4

आप इस तरह की त्रुटियों को संभालने के लिए वैश्विक jQuery AJAX त्रुटि हैंडलर प्राप्त कर सकते हैं, आमतौर पर कनेक्टिविटी समस्याओं से संबंधित। – Julien

+9

रीढ़ की हड्डी 0.5+ के रूप में, 'संग्रह # ताज़ा करें' [नाम बदल दिया गया था] (http://documentcloud.github.com/backbone/#changelog) 'संग्रह # रीसेट' पर। घटना का नाम बदलकर बदल दिया गया है। – ejel

+1

इसके अलावा, यह जानने के लिए उपयोगी है कि 'रीसेट' कॉलबैक में दो डिफ़ॉल्ट तर्क 'रीसेट "(संग्रह, विकल्प) हैं और संग्रह की पूरी सामग्री को प्रतिस्थापित करने पर यह ट्रिगर होता है। –

52

आदेश रीसेट घटना के साथ बाध्य करने में लाने() कॉल में सच: आप रीढ़ 1.0 का उपयोग कर रहे हैं, तो आप रीसेट में उत्तीर्ण होना होगा

trips.fetch({reset: true}); 
+6

अच्छा बिंदु। जब मैं मॉडल fetch() के आधार पर एक दृश्य रीफ्रेश करना चाहता हूं, तो मैं 'सिंक' से जुड़ा हूं। 1.0 में डिफ़ॉल्ट रूप से ट्रिगर किया गया है। –

19

रीढ़ 1.0 के रूप में, model.fetch() चलाता है एक 'सिंक'। यही वह है जो आपको बांधना चाहिए।

fetch: function(options) { 
    options = options ? _.clone(options) : {}; 
    if (options.parse === void 0) options.parse = true; 
    var model = this; 
    var success = options.success; 
    options.success = function(resp) { 
    if (!model.set(model.parse(resp, options), options)) return false; 
    if (success) success(model, resp, options); 

    // HERE'S THE TRIGGER! 
    model.trigger('sync', model, resp, options); 

    }; 
    wrapError(this, options); 
    return this.sync('read', this, options); 
}, 
+2

यह backbone.js स्रोत से वास्तविक कोड है, btw। मैंने बस अपनी टिप्पणी दोबारा पढ़ ली और आश्चर्य किया कि कोड खुद क्या था ... स्पष्ट होना बेहतर है। –

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