对于可怕的帖子标题感到抱歉,但很难总结。
我使用单独文件中的显示模块模式来定义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;
})();
我可以使用一种模式来解决这个问题吗?
答案 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);