【问题标题】:Backbone collection setting default API url using RequireJS使用 RequireJS 的主干集合设置默认 API url
【发布时间】:2011-11-21 20:13:16
【问题描述】:

如何为来自 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 的情况下重新路由请求?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。我尽量避免使用全局 myApp 对象(我使用 RequireJS 作为模块加载器),所以我无法在我的集合中访问它。也许是一个糟糕的设计决定?我想到了类似于 jQuery.ajaxSetup() for Backbone 的东西。
  • requireJS 在这里并不限制你,你只需要以不同的方式构造你的代码,上面的想法是一旦模型需要保存,它会通过这个函数从某个地方请求 url,它可以是一个全局的 myApp,它可以是一个你自己定义的配置模块。
  • 我接受您的回答,因为这是在 Backbone 中设置 URL 的正确方法。我认为我的问题比 Backbone 更与 RequireJS 相关。可悲的是,我仍然不知道如何从不同的模块获取我的设置并将变量存储在其中而不使用全局变量或每次都再次进行 AJAX 调用。
  • 难道不能在 requireJS 中有一个配置(或应用)模块吗?您可以在此处将其列为您的依赖模块,就像使用 communityModel 一样。
【解决方案2】:

通过覆盖(但不是覆盖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 代码来要求文件。

【讨论】:

    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多