Backbone.sync को ओवरराइड कैसे करें?


145

मैं बैकबोन.जेएस की कोशिश कर रहा हूं, और जिन चीजों की मैं कोशिश कर रहा हूं, उनमें से एक रिमोट एपीआई पर कॉल करना है, इसलिए मुझे बैकबोन.संकल्प को ओवरराइड करने में सक्षम होने की आवश्यकता है, क्योंकि मैं प्रलेखन को समझता हूं ।

इस बात का कोई उदाहरण नहीं है कि प्रलेखन में यह कैसे करना है, और बैकबोन के लिए एक Google समूह प्रतीत नहीं होता है ... क्या कोई ऐसा करने के लिए एक उदाहरण इंगित कर सकता है?


4
Google समूह की अनुपस्थिति में, freenode पर #documentcloud कमरे की जाँच करें और वहां अपना प्रश्न पूछें। बस यहाँ वापस आना सुनिश्चित करें और यदि आपको उत्तर मिलता है तो अपने स्वयं के प्रश्न का उत्तर दें। वहाँ बहुत सारे महान विचार-विमर्श हुए हैं और इसे संहिताबद्ध करना और आपके बाद आने वाले लोगों के लिए यह पता लगाना अच्छा है।
एंड्रयू डी एंड्रेड

जवाबों:


225

इस एनोटेट स्रोत उदाहरण पर एक नज़र डालें जहां वे Backbone.syncएक स्थानीयस्टोर विकल्प के साथ ओवरराइट करते हैं

रीढ़-localStorage

मूल रूप से Backbone.sync एक फ़ंक्शन होना चाहिए जो 4 तर्क लेता है:

Backbone.sync = function(method, model, options) { };

आपको options.successया तो आग लगने की आवश्यकता है या options.errorइस पर निर्भर करता है कि क्या methodसफल हुआ। तरीके प्रारूप में हैं:

  • "create" : उम्मीद है कि आप सर्वर पर मॉडल बनाते हैं
  • "read" : उम्मीद है कि आप सर्वर से इस मॉडल को पढ़ेंगे और इसे वापस करेंगे
  • "update" : उम्मीद है कि आप तर्क के साथ सर्वर पर मॉडल को अपडेट करते हैं
  • "delete" : उम्मीद है कि आप सर्वर से मॉडल को हटा दें।

आपको उन 4 विधियों को लागू करने और जो कुछ भी आप अपने लिए निर्धारित करना है उसे लागू करने की आवश्यकता है "server"

बेशक ये केवल वे चीजें हैं जिन्हें लागू Backbone.sync करना चाहिए । आप अधिक कार्यान्वित methodsकर सकते हैं और आप अधिक पैरामाटर्स वापस भेज सकते हैं, successलेकिन ऐसा नहीं करना सबसे अच्छा है।

यह सुनिश्चित करना सबसे अच्छा है कि यह Backbone.syncवर्तमान में भी ऐसा ही करता है ताकि आपकी प्रोग्रामिंग एक इंटरफ़ेस पर लागू हो। यदि आप अपनी संशोधित Backbone.syncलोकलस्टोरेज को स्विच-आउट करना चाहते हैं, तो आपको अपने विस्तारित बैकबोन।

[संपादित करें]

यह भी ध्यान दें कि आप के कई कार्यान्वयन का उपयोग कर सकते हैं sync। हर संदर्भ Backbone.syncactaully है (this.sync || Backbone.sync)तो आपको बस कुछ ऐसा करना होगा:

var MyModel = Backbone.Model.extend({ 
    ...

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncकेवल डिफ़ॉल्ट वैश्विक एक है जिसका उपयोग सभी मॉडल तब तक करते हैं जब तक कि मॉडल syncविशेष रूप से सेट न हो।


2
क्या होगा यदि मुझे लोकलस्टोरेज से एक मॉडल लाना है, जबकि एक अन्य सर्वर से प्राप्त होता है? क्या यह अभी तक संभव है?
पिकार्डो

19
(this.sync || Backbone.sync)संपादित देखें। एक और टिप रीढ़ की हड्डी के एनोटेट स्रोत को पढ़ने के लिए है। यह सब वहाँ है!
रेयानोस

3
प्रत्येक मॉडल के बारे में [संपादित करें] के बाद उसका खुद का सिंक होना बहुत महत्वपूर्ण है! धन्यवाद!
हाबिल

26
इस तथ्य का उल्लेख करने के लिए +1 कि आप किसी विशिष्ट मॉडल के सिंक विधि को ओवरराइड कर सकते हैं।
चेतन

12
बस एक जोड़: यदि आप syncअपने कोड में कहीं से भी "डिफ़ॉल्ट" कॉल करना चाहते हैं (आमतौर पर एक ओवरराइडन sync), तो बस एक करें Backbone.sync.call(this, method, this, options)
असममित

15

मुझे पता है कि यह उत्तर थोड़ा देर से है, और @ रेयानोस का उत्तर बहुत अच्छा है, लेकिन मैंने इसे थोड़ा अलग तरीके से किया, और शायद यह आपके लिए या किसी अन्य व्यक्ति के लिए बैकबोन के साथ एपीआई का उपयोग करने के लिए उपयोगी होगा।

Backbone.sync को ओवरराइड करने के बजाय, मैंने Backbone.ajax को ओवरराइड किया , क्योंकि यह वह जगह है जहाँ ajax अनुरोध किया गया है।

यहाँ एक उदाहरण है:

// Set the default implementation of `Backbone.ajax` to proxy through to `$`.
Backbone.ajax = function() {
    var args = Array.prototype.slice.call(arguments, 0);

    // Here, I add the OAuth token (or any other token)
    // But before, I check that data exists, if not I add it
    if (args[0]['data'] === undefined) {
        args[0]['data'] = {};
    }
    args[0]['data']['token'] = 'any_api_token_here';

    return Backbone.$.ajax.apply(Backbone.$, args);
};

11

मुझे आमतौर पर बैकबोन की syncविधि को ओवरराइड करने की आवश्यकता होती है जब मुझे केवल कुछ विशेषताओं को सिंक करने की आवश्यकता होती है। एक सामान्य कार्यान्वयन इस तरह दिखता है:

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}

और वह मॉडल या संग्रह में चला जाता है।
गाबे रेनबो

3
मामूली सुझाव: उस अंतिम पंक्ति को बदलने के बारे में क्या Backbone.sync.apply(this, arguments);? यह थोड़ा अधिक लचीला है यदि आप, उदाहरण के लिए, के ओवरराइड संस्करण में "विकल्प" तर्क को छोड़ने का निर्णय लेते हैं sync
लोचन

इस प्रश्न के भविष्य के खोजकर्ताओं के लिए कुछ और: Backbone.sync को वापस करना सुनिश्चित करें। a la backbonejs.org/docs/backbone.html#section-62
Lochlan

1
अब आप Backbone.model.save(attributes, {patch: true})आंशिक अपडेट करने के लिए उपयोग कर सकते हैं
रॉबोरके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.