Adicionar um URL raiz a todas as solicitações da API Backbone

TL; DR : você pode substituir (não substituir ) a Backbone.syncfunção para inserir o URL raiz para todas as solicitações.

Durante o desenvolvimento de um aplicativo de Backbone, não é incomum que a API seja hospedada em um servidor diferente do código que você está escrevendo (seu código de Backbone provavelmente está ativado localhost, enquanto a API pode estar em qualquer outro lugar da rede). Isso significa que você deseja adicionar o URL raiz a todas as suas solicitações.

Uma rápida olhada no Stack Overflow sugere que a maioria das pessoas contorna isso adicionando a URL raiz à propriedade url/ urlRootde cada modelo / coleção. Isso funciona, mas é muito ineficiente: mesmo se você estiver armazenando o URL raiz em uma variável em algum lugar (ou usando um arquivo de configuração ), você ainda repetirá o código para adicioná-lo a cada modelo / coleção que escrever.

Um Mixin

Uma opção seria configurar um RootURLobjeto mixin abstrato que tem uma urlfunção que todos os modelos e coleções usam:

rootURL.js

// Using AMD/RequireJS
define
(function () {
/*
* Create a `url` method that returns the root url

* plus a `stubURL` property

*/

url
: function () {
return 'http://root.url/' + this.stubURL;
}
});

EventModel.js

// Using AMD/RequireJS
define
(['rootURL'], function (rootURL) {
/*
* Mix the rootURL object into the new Model

* and store the `url` in the `stubURL` property

*/

return Backbone.Model.extend({
stubURL
: 'events'
}, rootURL);
});

Isso funcionará, mas você terá que se lembrar de usar o mixin toda vez que adicionar um novo modelo / coleção. Resumindo, é melhor do que repetir o urlcódigo em cada modelo / coleção, mas não é ótimo.

Sobrepor Backbone.sync

Há uma maneira muito mais simples de definir a URL raiz que aproveita o fato de que o optionsargumento que você passa é o que é então passado para a função jQuery . A função jQuery recebe uma propriedade, e isso é definido por . No entanto, se você definir a propriedade explicitamente, ela substituirá os conjuntos.Backbone.syncajaxajaxurlBackbone.syncurlBackbone.sync

Ao armazenar uma cópia da função original e substituí-la por nossa própria versão (que simplesmente define a propriedade e depois chama a original), podemos definir isso em cada chamada de API sem ter que adicioná-la explicitamente todas as vezes:Backbone.syncurl

// Using AMD/RequireJS
define
(['config'], function (config) {
'use strict';

// Store the original version of Backbone.sync
var backboneSync = Backbone.sync;

Backbone.sync = function (method, model, options) {
/*
* Change the `url` property of options to begin

* with the URL from settings

* This works because the options object gets sent as

* the jQuery ajax options, which includes the `url` property

*/

options
= _.extend(options, {
url
: config.api.url + (_.isFunction(model.url) ? model.url() : model.url)
});

/*
* Call the stored original Backbone.sync

* method with the new url property

*/

backboneSync
(method, model, options);
};
});

(Isso pressupõe que você configurou um arquivo de configuração )