在 BackboneJS 中自动定义自定义 JS 库

Auto defining a custom JS Library in BackboneJS

我创建了一个 JS 库来处理我所有的 API 调用。

有没有办法自动将其作为 api 包含在我的所有视图中,而无需在每个视图的顶部定义它?

我试过将它添加到主 js 文件中,但这似乎并没有体现在视图中。

每个 Backbone 模型都应该处理它的 API 端点通信,每个模块应该只需要它所依赖的模型。否则,它与使您的代码更加模块化的观点背道而驰。

话虽这么说,如果您只想让您的 API 库随处可用,有一些方法可以实现,您尝试失败的原因是因为每个模块的定义都没有 API 作为依赖,所以每个模块的创建顺序不一定是你想的那样。

您需要确保您的 API 模块在 Backbone 之后定义,但在其他所有内容之前定义 。我喜欢的一种方法是创建一个覆盖模块。

  1. 制作一个新模块,(例如backbone.extension.js)。
  2. 用Backbone覆盖你想要的任何东西。
  3. 使用 map config option 将每个模块的名为 backbone 的依赖项指向您的新模块。
  4. 同样,使用 map 选项,使您的新模块指向原始 backbone

为什么要使用 map 选项?

因为我喜欢在 require 配置中正确定义每条路径。我不希望任何库路径位于我的自定义模块之一中。如果改了,我只需要改一个地方就可以了。

如何配置要求覆盖 Backbone?

制作你的模块,说 custom/plugins/backbone.extension.js

然后,配置路径并将它们映射到正确的文件:

paths: {
    "backbone": "lib/backbone/backbone",
    "backbone.extension": "custom/plugins/backbone.extension"
},
map: {
    "*": {
        // every module should use our custom module.
        "backbone": "backbone.extension",
    },
    // our custom module should use the original backbone
    "backbone.extension": { "backbone": "backbone", },
},

如何覆盖Backbone?

制作一个依赖 Backbone 和您的 API 库的模块。

defined(['backbone', 'api'], function(Backbone, api){
    var View = Backbone.View;
    var BackboneExtView = View.extend({
        api: api
    });
    Backbone.View = BackboneExtView;

    // or, for this simple case
    Backbone.View.prototype.api = api;

    retrun Backbone;
});

可能出现的一个问题是如果您的 API 模块需要 Backbone。如果是这种情况,您可以向 map 配置添加一个例外,这样您的 API 需要原始的 Backbone 并且它避免了循环依赖。