如何为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调用以获取我的设置,包括API的网址(api.local)。
如何在不将请求传递给我的所有模型或对模型和集合中的url进行硬编码的情况下重新路由请求?
答案 0 :(得分:5)
你的网址采用字符串或函数。
使用您的设置ajax调用,您可以将其存储在适当的位置, 并从函数
获取使用你的例子:
假设你的ajax调用,将网址保存在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时,如果您的初始ajax调用失败或花费时间,您的应用可能已经启动而没有设置,如果使用{{1}那时,你需要处理这个问题。
答案 1 :(得分:0)
通过覆盖(但不是覆盖)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
代码的文件。