在不同的amd模块之间共享资源

Wol*_*mec 13 requirejs backbone.js

我正在开发一个新的Web应用程序.

这是我第一次使用带有AMD模块的requirejs.

要习惯那种新的范例并不容易 - 据我所知 - 全局命名空间中没有变量.

在以前的Web应用程序中,我总是在全局命名空间中有一个变量,我可以用它来跨不同模块共享多个资源.

现在使用requirejs AMD模块,我使用backbone.js和jquery(两个amd版本 - jquery 1.7.1和backbone.js 0.5.3-optamd3).

在我的应用程序的某处,我从服务器(用户对象)获取backbone.js模块.我想从不同的AMD模块访问该模块.我还想拥有一个应用程序范围的事件对象.

你能告诉我:在requirejs AMD中,在不同模块之间共享资源的正确方法是什么?

Wol*_*mec 31

我自己找到了解决方案.

谢谢你,IntoTheVoid,你的答案,但我希望有类似AMD的解决方案.这意味着,不再"污染"全局命名空间.

我的解决方案有两个关键:

" https://github.com/addyosmani/backbone-aura "从阿迪奥斯马尼和" https://github.com/amdjs/amdjs-api/wiki/AMD "的异步模块定义(AMD)API规范.

规范说:"如果工厂是一个功能,它应该只执行一次."

因此,如果AMD模块多次指定为一个Web应用程序的依赖,依赖关系不仅没有加载多次,也不会执行多次,这是新的东西给我.它只执行一次,并保留工厂功能的返回值.具有相同路径的每个依赖项具有相同的对象.而这改变了一切.

因此,您只需定义以下amd模块:

define([], function() {
    var app_registry = {};
    app_registry.global_event_obj = _.extend({}, Backbone.Events);
    app_registry.models = {};
    return app_registry;
});
Run Code Online (Sandbox Code Playgroud)

现在,在您要共享资源的那些模块中,将此app_registry模块声明为依赖项并写入一个:

define(['jquery','underscore','backbone','app_registry'], 
  function ($, _, Backbone, app_registry){
    var firstView = Backbone.View.extend({
    initialize: function() {
        _.bindAll (this, 'methodOne'); 
        this.model.bind ('change', this.methodOne);   
        this.model.fetch();
    },  
    methodOne: function() {
        app_registry.models.abc = this.model;
    }
    ...
Run Code Online (Sandbox Code Playgroud)

在另一个:

define(['jquery','underscore','backbone','app_registry'], 
  function ($, _, Backbone, app_registry){
    var secondView = Backbone.View.extend({
    initialize: function() {
       _.bindAll (this, 'methodTwo'); 
        app_registry.global_event_obj.bind ('special', this.methodTwo);
    },  
    methodTwo: function() {
        app_registry. ...
    }
    ...
Run Code Online (Sandbox Code Playgroud)