Как установить URL-адрес по умолчанию для всех моих запросов из коллекций и моделей в Backbone?
Пример коллекции:
define([
'backbone',
'../models/communityModel'
], function(Backbone, CommunityModel){
return Backbone.Collection.extend({
url: '/communities', // localhost/communities should be api.local/communities
model: CommunityModel,
initialize: function () {
// something
}
});
});
Я делаю начальный вызов AJAX, чтобы получить мои настройки, включая URL-адрес API (api.local).
Как я могу перенаправить запросы без передачи его ко всем моим моделям или жестко кодировать URL-адрес в моделях и коллекциях?
ваш url принимает строку или функцию.
с вашими настройками ajax-вызова вы можете сохранить его в нужном месте, и перейдите к нему из функции
чтобы использовать ваш пример:
предположим, что ваш вызов ajax, сохранил URL-адрес в myApp.Settings.DefaultURL
define([
'backbone',
'../models/communityModel'
], function(Backbone, CommunityModel){
return Backbone.Collection.extend({
url: function(){
return myApp.Settings.DefaultURL + '/communities';
},
model: CommunityModel,
initialize: function () {
// something
}
});
});
замечание
убедитесь, что этот URL-адрес каким-то образом пойман или обработан, когда он будет запущен до того, как ваши настройки будут установлены, если ваш первоначальный аякс-вызов завершится неудачей или займет свое время, ваше приложение может быть запущено без его установки, если вы используете model.save()
в этот момент вам нужно будет справиться с этим.
Перегружая (но не переписывая) метод Backbone.sync
, вы можете добиться того же результата, не добавляя один и тот же код к каждой отдельной модели/коллекции.
define(['underscore', 'backbone', 'myApp'], function (_, Backbone, myApp) {
'use strict';
// Store the original version of Backbone.sync
var backboneSync = Backbone.sync;
// Create a new version of Backbone.sync which calls the stored version after a few changes
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.url = myApp.Settings.DefaultURL + _.isFunction(model.url) ? model.url() : model.url;
// Call the stored original Backbone.sync method with the new url property
backboneSync(method, model, options);
};
});
Затем в вашей модели/коллекции вы можете просто объявить url
как обычно (например, url: '/events
)
Не забудьте потребовать файл с новым кодом Backbone.sync
где-нибудь.