TL; DR : você pode substituir (não substituir ) a Backbone.sync
funçã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
/ urlRoot
de 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 RootURL
objeto mixin abstrato que tem uma url
funçã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 url
có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 options
argumento 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.sync
ajax
ajax
url
Backbone.sync
url
Backbone.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.sync
url
// 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 )