2012-06-07 8 views
5

LocalStorage साथ Backbone.js के प्रयोग पर सिर्फ एक बहुत ही कम सवाल अधिलेखित कर देता है। जब मेरी वेबसाइट एकाधिक ब्राउज़र विंडो/टैब में खुलती है और दोनों विंडो में उपयोगकर्ता सूची में कुछ जोड़ता है, तो एक विंडो के परिवर्तन अन्य विंडो में किए गए परिवर्तनों को ओवरराइट कर देंगे।backbone.js और एकाधिक ब्राउज़र टैब/खिड़कियों के साथ स्थानीय भंडारण डेटा

आप खुद के लिए कोशिश करने के लिए, बस उदाहरण Backbone.js तोदो एप्लिकेशन का उपयोग करना चाहते हैं: दो ब्राउज़र टैब

  • में

    1. ओपन http://backbonejs.org/examples/todos/index.html पहला टैब में एक आइटम 'ITEM1' जोड़ें और 'ITEM2 केवल

    कोई सुझाव कैसे, किसी भी मानक तरीका डी करने के लिए ITEM1 'गायब हो जाएगा और आप के साथ छोड़ दिया हो जाएगा' ITEM2 'ऐसा होने से रोकने के लिए:' दूसरे टैब में

  • दोनों टैब को रिफ्रेश ' इसके साथ अल?

    Thxx

  • उत्तर

    4

    समस्या अच्छी तरह से ज्ञात समेकन अद्यतन अद्यतन समस्या है, Lost update in Concurrency control? देखें। latest Github version of Backbone localStorage लिए

    save: function() { 
        // reread data right before writing 
        var store = localStorage.getItem(this.name); 
        var data = (store && JSON.parse(store)) || {}; 
        // we may choose what is overwritten with what here 
        _.extend(this.data, data); 
    
        localStorage.setItem(this.name, JSON.stringify(this.data)); 
    } 
    

    , मुझे लगता है कि यह इस तरह दिखना चाहिए: बस आपके सहयोग के लिए मैं निम्नलिखित त्वरित और गंदी ठीक प्रस्तावित कर सकते हैं, फ़ाइल backbone-localstorage.js, Store.prototype.save

    save: function() { 
        var store = this.localStorage().getItem(this.name); 
        var records = (store && store.split(",")) || []; 
        var all = _.union(records, this.records); 
        this.localStorage().setItem(this.name, all.join(",")); 
    } 
    
    +0

    धन्यवाद! बस मुझे संकेत की जरूरत है। मुझे पता है कि यह एक हैक की तरह है लेकिन यह चाल है। – user1151506

    +2

    मैंने कोड को शामिल करने के लिए आपकी प्रतिक्रिया संपादित की जो बैकबोन लोकल स्टोरेज के नवीनतम गीथब संस्करण के साथ काम करता है। – user1151506

    +0

    अरे, आप इसे साफ़ करने के बारे में कैसे जाते हैं? – Lion789

    2

    आप इसके बजाय sessionStorage का उपयोग करना चाह सकते हैं। http://en.wikipedia.org/wiki/Web_storage#Local_and_session_storage देखें।

    +0

    यह सही उत्तर है। Backbone.js के लिए केवल एक स्थानीय-स्टोरेज एडेप्टर है, http://backbonejs.org/docs/backbone-localstorage.html आपको सत्र-संग्रहण –

    +0

    का उपयोग करने के लिए अपना स्वयं का कार्यान्वयन लिखना होगा क्षमा करें, मुझे और स्पष्ट होना चाहिए था। मैं चाहता हूं कि ** स्थानीय स्टोरेज ** है, क्योंकि मुझे सत्रों के बीच डेटा को बनाए रखने की आवश्यकता है। उपरोक्त टोडो सूची को उदाहरण के रूप में लें: जब आप टैब या ब्राउज़र विंडो बंद करते हैं तो आप अपनी टोडो सूची को साफ़ नहीं करना चाहते हैं। अगली बार जब आप अपने ऐप पर वापस आएं, तो आप वहां रहना चाहते हैं। – user1151506

    +0

    कल्पना कीजिए कि आपने दो खिड़कियां खोली हैं, अलग-अलग डेटा भर चुके हैं, दोनों को बंद कर दिया है, एक नया खोला है। पहले से बंद किए गए दोनों में से कौन से डेटा लेना चाहिए? तब आपको पूर्ण प्रमाणीकरण और प्रमाणीकरण की आवश्यकता है। – Yaroslav

    2

    यारोस्लाव के जाँच के बारे में टिप्पणी नए बने रहने से पहले बदलावों के लिए एक समाधान है लेकिन मेरा सुझाव अलग होगा। याद रखें कि स्थानीय स्टोरेज घटनाओं को फायर करने में सक्षम है जब यह उस क्रिया को निष्पादित करता है जो उसके डेटा को बदलता है। उन घटनाओं से जुड़ें और प्रत्येक टैब उन परिवर्तनों को सुनें और ऐसा होने के बाद पुन: प्रस्तुत करें देखें।

    फिर, जब मैं एक टैब में हटा देता हूं या जोड़ता हूं और अगले स्थान पर जाता हूं, तो यह एक ईवेंट प्राप्त करेगा और दूसरे टैब में जो हुआ उससे प्रतिबिंबित करने के लिए बदल जाएगा। टैब में टैब को देखकर मैं अजीब विसंगति नहीं रखूंगा।

    आप यह सुनिश्चित करने के लिए कुछ सोचना चाहते हैं कि मैं कुछ खोना नहीं चाहता हूं (कहना है कि मैं अपनी टू-डू सूची के लिए एक नई प्रविष्टि लिखना शुरू करता हूं), दूसरे टैब पर स्विच करें और हटाएं कुछ, और फिर वापस आना मैं प्रवेश गायब देखना चाहता हूं लेकिन मेरा आंशिक रूप से टाइप किया गया नया आइटम अभी भी मेरे लिए उपलब्ध होना चाहिए।

    +0

    इस समाधान में बेहतर उपयोगकर्ता अनुभव है। – Yaroslav

    +0

    यह समाधान औपचारिक रूप से अधिक सही लगता है और हैक से कम होगा, सच! लेकिन यह आईई, सफारी और क्रोम में बहुत सारे quirks या समर्थन की कमी के साथ आता है। बस कोशिश की और यह एफएफ में अच्छी तरह से काम करता है लेकिन वास्तव में क्रोम में नहीं, यही कारण है कि मैं ऊपर वर्णित हैक के साथ गया था। – user1151506

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