2012-04-03 17 views
10

मैं रेल 3.2.2 पर बैकबोन जेएस 0.9.2 चला रहा हूं, मेरे पास लागत पंक्ति जोड़ने के लिए एक पृष्ठ है। एक लागत में 3 टेक्स्टफिल्ड्स हैं: शीर्षक, विवरण और मूल्य।अजाक्स कतार बैकबोन जेएस

मैं धुंध पर प्रत्येक लागत को बचा रहा हूं।

model.save() बहुत कम अंतराल के साथ कई बार बुलाया जाता है। कौन सा मुद्दे create(post) अनुरोध करता है तो उसके बाद शीघ्र ही एक update(put) अनुरोध। जिस समस्या का मैं अनुभव कर रहा हूं वह यह है कि POUT अनुरोध कभी-कभी पोस्ट से पहले सर्वर तक पहुंच जाता है, नतीजतन यह मॉडल बन जाता है और दो बार (डुप्लिकेट) बना रहता है।

धुंध को बचाने के लिए अनुरोधित व्यवहार है, इसलिए मुझे अनुरोधों को कतारबद्ध करने का एक तरीका चाहिए। मैंने स्पाइन जेएस के बारे में कुछ पढ़ा है, और वे इसे किसी तरह की कतार द्वारा हल करते हैं। मैंने this में भी देखा है, लेकिन इसे समझने के लिए प्रतीत नहीं होता है।

ऐसा लगता है कि यह "एकल-पृष्ठ-ऐप्स" के साथ काम करना एक आम मुद्दा होना चाहिए लेकिन इसके बारे में कुछ भी नहीं मिल रहा है।

उत्तर

9

आप बचत विधि को ओवरराइड कर सकते हैं और deferred object के साथ एक कतार बना सकते हैं। उदाहरण के लिए,

var MDef = Backbone.Model.extend({ 
    url: "/echo/json/?delay=3", 

    initialize: function() { 
     this.queue = $.Deferred(); 
     this.queue.resolve(); 
    }, 

    save: function(attrs,options) { 
     var m = this; 
     console.log("set "+JSON.stringify(attrs)); 

     // this.queue = this.queue.pipe with jquery<1.8 
     this.queue = this.queue.then(function() { 
      console.log("request "+JSON.stringify(attrs)); 
      return Backbone.Model.prototype.save.call(m, attrs, options); 
     });    
    } 
}); 

var m = new MDef(); 
m.save({title: "a title"}); 
m.save({description: "a description"}); 
m.save({price: "a price"}); 

और एक फिडल: http://jsfiddle.net/nikoshr/8nEUm/

+0

महान परिणामों के साथ इसका उपयोग करके, धन्यवाद! –

3

उपयोगकर्ता debounceunderscore.js से।

उत्तीर्ण फ़ंक्शन का एक नया अस्वीकार संस्करण बनाता है और लौटाता है जो अंतिम निष्पादन के बाद प्रतीक्षा मिलीसेकंड समाप्त होने के बाद तक इसके निष्पादन को स्थगित कर देगा।

इस तरह यह केवल अंतिम blur ईवेंट के बाद एक बार आग लग जाएगा।

+2

कि एक बुलेट प्रूफ समाधान है, यह ज्यादातर मामलों का समाधान हो सकता है, लेकिन अभी भी एक मौका डेटा नष्ट हो सकता है। –

+0

@ टिमब्रन्समो, @ अब्राहम 'debounce' सही है। डेटा कैसे खो जाएगा? यदि आप आवधिक बचत को मजबूर करना चाहते हैं तो आप इसे * _.throttle' से बदल सकते हैं। – ggozad

+1

@ggozad यदि कोई फ़ील्ड केंद्रित है और उपयोगकर्ता पृष्ठ छोड़ना चुनता है, उदाहरण के लिए "अगला" बटन क्लिक करना, तो एक मौका है कि धुंधला ईवेंट कभी भी अनुरोध जारी नहीं करता है। यदि कोई कतार है, तो आप जांच सकते हैं कि कतार समाप्त हो गई है और फिर उपयोगकर्ता को साथ जाने दें। –

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