Backbone集合使用RequireJS设置默认API URL

时间:2011-11-21 20:13:16

标签: javascript model-view-controller api backbone.js requirejs

如何为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进行硬编码的情况下重新路由请求?

2 个答案:

答案 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代码的文件。