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