2012-10-04 13 views
6

के साथ इंडेक्सड डीबी के साथ-साथ दूरस्थ सर्वर का उपयोग करना मैं ऑफ़लाइन-सक्षम वेब ऐप पर काम कर रहा हूं। मैं क्लाइंट कोड के लिए Backbone.js का उपयोग कर रहा हूँ। मुझे ऑनलाइन/ऑफलाइन राज्य के अनुसार रिमोट सर्वर और स्थानीय इंडेक्सड डीबी के बीच स्विच करने के लिए backbone.js की आवश्यकता है। निम्न में से कौन सा तरीका यह करने का सही तरीका है:बैकबोन.जेएस

  1. सुपरफ़ेडर द्वारा इस indexeddb-backbone adapter का उपयोग करें। लेकिन मुझे लगता है कि यह ऑफ़लाइन स्टोरेज के लिए और अधिक ऑफ़लाइन और ऑनलाइन दोनों को पूरा करता है।
  2. backbone.js में सिंक() विधि को ओवरराइड करें और इसलिए अपनी खुद की विशिष्ट विशिष्ट एडाप्टर बनाएं।
+0

बहुत रोचक। ऐप सीधे इंडेक्सड डीबी का उपयोग कर सकते हैं और इंडेक्सड डीबी रैपर सिंक को सर्वर पर जाने दें। यदि कोई संघर्ष है, तो रैपर को अद्यतन घटना भेजनी चाहिए। यह प्रत्येक भूमिका को सरल बना देगा। –

+0

@KyawTun धन्यवाद, यह एक अच्छा डिजाइन लगता है! लेकिन जो भी डिज़ाइन मैं आया हूं, मुझे इंडेक्सड डीबी और रिमोट सर्वर दोनों के साथ संवाद करने के लिए backbone.js की आवश्यकता होगी। मेरा सवाल यह है कि मेरी पोस्ट में उल्लिखित दो तरीकों में से कौन सा तरीका ऐसा करने का बेहतर तरीका है। – shreyj

उत्तर

5

मुझे शूट करने दें। मैंने कभी backbone.js का उपयोग नहीं किया है। हालांकि, मेरे पास शानदार इंडेक्स डीडी रैपर YDB-DB है और मैं backbone.js और angular.js बाध्यकारी ढांचे का समर्थन करने की योजना बना रहा हूं। लेकिन ऐसा करने के लिए बहुत कुछ नहीं लगता है।

जैसा कि प्रश्नकर्ता ने सुझाव दिया है, Backbone.sync(method, model, options) ओवरराइड करने के एडाप्टर पैटर्न डेटाबेस रैपर लाइब्रेरी के साथ कुछ अतिरिक्त तर्क के साथ संभव है।

Backbone.sync वापसी वस्तु को jqXHR ऑब्जेक्ट होने की उम्मीद है, जो Promise interface लागू करता है। Backbone.sync क्लाइंट-साइड डेटाबेस में कैशिंग के लिए छेड़छाड़ करने के लिए ओवरराइड किया गया है। डेटा स्रोत प्रदाता, $.db, दिए गए मॉडल से संबंधित स्कीमा सेट किया गया है। (अधिक विस्तार के लिए वाईडीएन-डीबी देखें।) मुझे उम्मीद है कि बैकएंड सर्वर Google GData- जैसे मॉडल डेटा (एटम एंट्री) स्वीकार करेगा, जिसमें प्रत्येक मॉडल में एटैग विशेषता और आशावादी संघर्ष समाधान का उपयोग किया जाता है।

$.db = new ydn.db.Storage('db_name', schema); 

var Backbone_sync = Backbone.sync; 
Backbone.sync = function(method, model, options) { 
    var df = $.Deferred(); 
    if (method == 'read') { 
    var df_db = $.db.get(model.name, model.cid); 
    df_db.done(function(data) { 
     if (data) { 
     df.resolve(data); 
     options['header'].push({'If-Not-Match': data.etag}); 
     var ajax_df = Backbone_sync(method, model, options); 
     ajax_df.done(function(new_data) { 
      if (new_data) { 
      assert(new_data.cid == model.cid); 
      $.db.put(model.name, new_data); 
      model.set(new_data).change(); 
      } // else, no change 
     }); 
     } else { 
     var ajax_df = Backbone_sync(method, model, options); 
     df.pipe(ajax_df); 
     ajax_df.done(function(new_data) { 
      $.db.put(model.name, new_data); 
     }); 
     } 
    }); 
    df_db.fail(function(e) { 
     throw e; // db connection blocking, or schema mismatch 
    }); 
    } else if (method == 'update') { 
    options['header'].push({'If-Match': model.etag}); 
    var ajax_df = Backbone_sync(method, model, options); 
    df.pipe(ajax_df); 
    ajax_df.done(function(new_data, status) { 
     if (status == 409) { // conflict 
     assert(new_data.cid == model.cid); 
     $.db.run(function(db) { // run in transaction 
      db.get(model.name, model.cid).done(function(data) { // NOTE: not $.db 
      if (data) { 
       var resolved_data = $.magic.resolve(new_data, data); 
       db.put(model.name, resolved_data); 
       model.set(resolved_data);    
       model.save(); // send merge result to server     
      } else { 
       db.put(model.name, new_data); 
      } 
      }); 
     }, model.name, 'readwrite'); // transaction scope of model object store for read write operations 
     } else if (status == 404) { // not found 
     $db.clear(model.name, model.cid); 
     } else if (status < 300) { 
     assert(new_data.cid == model.cid); 
     $.db.put(model.name, new_data); 
     } 
    }); 
    } 

    return df; 
}; 

शेष तरीकों को उसी तरह लागू किया जा सकता है। संग्रह और क्वेरी डेटाबेस कैश से भी छेड़छाड़ और आपूर्ति कर सकते हैं।

यदि सर्वर etag लागू नहीं करता है, तो यह अभी भी काम करता है, लेकिन आप सर्वर बैंडविड्थ को सहेज नहीं पाएंगे, न ही संघर्ष को हल करेंगे।

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