松散耦合的JS模块 - 带有随机文件加载顺序的骨干继承?

时间:2015-03-19 23:35:45

标签: javascript backbone.js module

对于可怕的帖子标题感到抱歉,但很难总结。

我使用单独文件中的显示模块模式来定义JS模块,这些文件包含在IFFE中,位于名称空间" App"之下。通过检查" App"的存在在每个文件中,它们可以按任何顺序加载(脚本标记通过构建过程注入到HTML中 - 因此可能按字母顺序添加)。

有些模块纯粹是Backbone视图。

以下2个文件正常工作,按任意顺序加载:

app.js:

App = window.App || {};

App.Main = (function(){

    var init = function(){
        var view = new App.BaseView();
    }

    return {
        init: init
    }

})();

base_view.js:

App = window.App || {};

App.BaseView = (function(){

    var View = Backbone.View.extend({

        initialize: function(){
            console.log('base view init');
        }

    }); 

    return View;

})();

通过调用App.Main.init(),可以在文档就绪时触发整个应用程序。我知道当时所有模块都已加载 - 无论顺序如何;

但是,如果我想要扩展 BaseView的另一个视图,我需要知道之前加载了 base_view.js 。如果在 base_view.js 之前加载了,则以下文件将无效(即使它正在检查" App"是否存在;必要时创建它,它依赖于已定义的BaseView:

another_view.js:

App = window.App || {};

App.AnotherView = (function(){

    var View = App.BaseView.extend({ //App.BaseView may not be defined!

        initialize: function(){
            console.log('base view init');
        }

    }); 

    return View;

})();

我可以使用一种模式来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我确定你正在寻找一个比这个更好的答案,但你可以简单地尝试将它包装在某种“等待它”的范围内。区间循环?

   App = window.App || {};
   var interval = setInterval(function() {
       // get elem
       if (typeof App.BaseView == 'undefined') return;
       clearInterval(interval);

       // the rest of the code
    }, 10);