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

时间:2016-11-20 20:00:12

标签: javascript backbone.js requirejs

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

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

我已经尝试将其添加到主js文件中,但这似乎不会进入视图。

1 个答案:

答案 0 :(得分:2)

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

话虽如此,如果您只是希望您的API库随处可用,有一些方法可以实现这一点,并且您尝试失败的原因是因为每个模块都是在没有API作为依赖项的情况下定义的,所以每个模块的顺序创建不一定是你想的那个。

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

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

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

    如何配置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,并且它避免了循环依赖。