2015-08-20 7 views
7

bağlı params, biz url var ve urlRoot öznitelikler:Omurga Modelleri - değişiklik URL sorgu bir Omurga modeli içinde DİNLENME eylem

  url: function(){ 

       return '/jobs' 
      }, 


      urlRoot: function() { 

       return '/jobs' 
      }, 

ancak bağlı url params veya sorgu params eklemek istediklerinizi böyle bir şey başarmak için iyi bir yol

 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; 
    }, 

vardır: vb

Yani böyle bir şey yapmak istiyorum, POST, PUT, DELETE GET olan talebi, türü?

cevap

6

Varsayılan olarak, Backbone modelleri ve koleksiyonları, sunucuyla etkileşimde bulunmak için Backbone.sync işlevine yetki verir. Örneğinizde olduğu gibi HTTP yöntemine erişebileceğiniz kapsam budur. Bu davranışı özelleştirmek için bir modeldeki veya koleksiyondaki senkronizasyon işlevini geçersiz kılabilirsiniz. Backbone.sync için documentation ve source code ve Backbone.sync'un kullandığı for jQuery.ajax'a bakın.

Bir süredir Omurga veya JavaScript dokunmadım ama (yazılı olarak çalışmak için beklemeyin, bu temelde sözde kodudur) böyle görünecektir hayal ediyorum:

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]); 
} 

Muhtemelen bundan daha çok daha alçakgönüllüyecektir, ama umarım bu noktaya ulaşır.

+1

Bu tamamen doğrudur. Senkronizasyonu geçersiz kılmanız gerekiyor. Bu belgede trvrfrd'ın işaret ettiği yeterli araştırma, bunun neden doğru olduğunu açıklayacaktır. Bu kişi lütfunu hak ediyor. –

2

Model değişkenlerinden başka, kontrol değişkenlerine ihtiyacınız varsa, tamamen farklı bir yaklaşım benimseyebilir ve talebe uygun üstbilgiler ekleyebiliriz; bu şekilde, çekirdeği değiştirmek ve test süresini uzatmak zorunda kalmayız.

var MyModel = new Backbone.Model(); 


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

// & Yukarıdaki kod test edilmedi ama çoğunlukla çalışması gerekir Benzer

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

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

ele alınabilir SİL GET.

Referanslar:

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

Sana url oluştururken type belirtebilirsiniz eğer ne var yeterince iyi olduğunu düşünüyorum.

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; 
} 

Olumsuz url() gerektiğinde,() Eğer 'türü' argüman yourslf sağlamak zorunda 2. Kendini urlExtend aramak 1. ihtiyacıdır. Bunu beğenmezseniz

, size senkronizasyon geçersiz kılmak için Omurga yüklemek sonra yukarıdaki kodu yerleştirebilirsiniz olabilir 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.. 

geçersiz olabilir.