2015-08-20 12 views
7

के आधार पर params एक रीढ़ मॉडल के अंदर, हम यूआरएल है और urlRoot गुण:रीढ़ मॉडल - परिवर्तन URL क्वेरी बाकी कार्रवाई

  url: function(){ 

       return '/jobs' 
      }, 


      urlRoot: function() { 

       return '/jobs' 
      }, 

लेकिन मैं के आधार पर यूआरएल को पैरामीटर या क्वेरी पैरामीटर जोड़ना चाहते हैं, क्या

 url: function(type, opts){ //type and opts arguments are not available in Backbone, I just made them up for this example 

      var url = '/jobs'; 

      switch (type) { 
       case 'GET': 
       break; 
       case 'POST': 
       break; 
       case 'PUT': 
       url = url + '?optimisticDelete=' + opts.optimisticDelete; 
       break; 
       case 'DELETE': 
       url = url + '?upsert=' + opts.upsert; 
       break; 

       default: 
       throw new Error('no match'); 
       } 

      return url; 
    }, 

वहाँ एक अच्छा तरीका कुछ इस तरह पूरा करने के लिए है: अनुरोध यह है मिलता है, पोस्ट, डाल हटाने इत्यादि

तो मैं इस तरह कुछ करना चाहता हूँ के प्रकार?

उत्तर

6

डिफ़ॉल्ट रूप से, बैकबोन मॉडल और संग्रह सर्वर के साथ बातचीत करने के लिए Backbone.sync फ़ंक्शन पर प्रतिनिधि होते हैं। यही वह दायरा है जहां आपके पास आपके उदाहरण में HTTP विधि तक पहुंच होगी। आप इस व्यवहार को अनुकूलित करने के लिए किसी मॉडल या संग्रह पर सिंक फ़ंक्शन को ओवरराइड कर सकते हैं। और source codeBackbone.sync और for jQuery.ajax के लिए देखें, जो Backbone.sync उपयोग करता है।

मैं एक समय में एक रीढ़ या जावास्क्रिप्ट छुआ है, लेकिन मैं इसे कुछ इस तरह दिखेगा कल्पना कर सकते हैं (यह मूल रूप से छद्म कोड है, के रूप में लिखा यह काम करने की उम्मीद नहीं है):

sync: function (method, model, options) { 
    // method corresponds to the HTTP verb ("type" in your example) 
    switch (method) { 
     // ...build the correct url like in your example... 
    } 
    options = options || {}; 
    options.url = url; // tack correct url onto options object 
    return Backbone.sync.apply(this, [method, model, options]); 
} 

इससे अधिक संभावना अधिक हो जाएगी, लेकिन उम्मीद है कि यह बिंदु पूरी हो जाएगी।

+1

यह बिल्कुल सही है। आपको सिंक ओवरराइड करने की आवश्यकता है। उस दस्तावेज़ीकरण में पर्याप्त अन्वेषण trvrfrd ने समझाया कि यह सही क्यों है। इस व्यक्ति को बक्षीस का हकदार है। –

2

यदि आपको नियंत्रण चर की आवश्यकता है तो मॉडल विशेषताओं के अलावा, हम एक पूरी तरह से अलग दृष्टिकोण भी ले सकते हैं और अनुरोध में उचित शीर्षलेख जोड़ सकते हैं, इस तरह हमें कोर को संशोधित करने और परीक्षण में समय निवेश करने की आवश्यकता नहीं है।

var MyModel = new Backbone.Model(); 


if(MyModel.isNew()){ //create 
    MyModel.save(MyModel.attributes, { headers: { 'create': 'true' }}); 
}else{ 
    MyModel.save({}, { headers: { 'upsert': 'true' }}); 
} 

// & GET हुए हटाए इसी तरह

MyModel.fetch({ headers: { 'get': 'true' }}); 

    MyModel.delete({ headers: { 'delete': 'true' }}); 

संभाला जा सकता है इसके बाद के संस्करण कोड अपरीक्षित है लेकिन ज्यादातर काम करना चाहिए।

संदर्भ:

http://backbonejs.org/#Model-save

http://backbonejs.org/#Model-isNew

How can I add a custom HTTP header to ajax request with js or jQuery?

3

मुझे लगता है कि आप काफी अच्छा होता है जब आप यूआरएल बनाने के लिए यदि आप type निर्दिष्ट कर सकते हैं।

urlExtended: function(type, opts) { 
    var url = this.url(); 

    switch (type) { 
    case 'GET': 
     break; 
    case 'POST': 
     break; 
    case 'PUT': 
     url = url + '?optimisticDelete=' + opts.optimisticDelete; 
     break; 
    case 'DELETE': 
     url = url + '?upsert=' + opts.upsert; 
     break; 

    default: 
     throw new Error('no match'); 
    } 

    return url; 
} 

नकारात्मक 1. जब यूआरएल() की जरूरत है, urlExtend कॉल करने के लिए() अपने आप को 2. आप 'प्रकार' तर्क yourslf प्रदान करने के लिए की जरूरत है।

आपको लगता है कि पसंद नहीं है, तो आप Backbone.sync

Backbone.sync = function(method, model, options) { 
    var type = methodMap[method]; 

    // Default options, unless specified. 
    _.defaults(options || (options = {}), { 
     emulateHTTP: Backbone.emulateHTTP, 
     emulateJSON: Backbone.emulateJSON 
    }); 

    // Default JSON-request options. 
    var params = {type: type, dataType: 'json'}; 

    // Ensure that we have a URL. 
    // if (!options.url) { 
    // params.url = _.result(model, 'url') || urlError(); 
    // } 

     if (!options.url) { 
      if(model.urlExtended) { 
       // type is GET, POST... 
       // options are what you passed to fetch, save, etc.. as options 
       params.url = model.urlExtended(type, options); 
      } else { 
       params.url = _.result(model, 'url') || urlError(); 
      } 
     } 
... rest of Backbone.sync code.. 

ओवरराइड आप रीढ़ लोड के बाद सिंक ओवरराइड करने के लिए उपरोक्त कोड बन सकता था सकता है।

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