1

如何为来自 Backbone 中的集合和模型的所有请求设置默认 url/服务器?

示例集合:

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 的 url (api.local)。

如何在不将请求传递给我的所有模型或硬编码模型和集合中的 url 的情况下重新路由请求?

4

2 回答 2

5

您的网址采用字符串或函数。

使用您的设置 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 时以某种方式捕获或处理此 url,如果您的初始 ajax 调用失败或花费时间,您的应用程序可能已经在没有设置设置的情况下启动,如果当时使用model.save()a ,你需要处理这个。

于 2011-11-22T00:30:15.707 回答
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某处要求带有新代码的文件。

于 2013-10-20T13:12:23.120 回答