这是在使用domReady之前的我的main.js:
require.config({
paths : {
loader : 'libs/backbone/loader',
jQuery : 'libs/jquery/jquery-module',
Underscore : 'libs/underscore/underscore-module',
Backbone : 'libs/backbone/backbone-module',
templates : '../Templates'
}
});
require([ 'app' ], function(app) {
app.initialize();
});
并且 app.js:
define([ 'jQuery', 'Underscore', 'Backbone', 'router',
'services/Initializers/MainFrameInitializer',
'services/Initializers/FlowsViewsInitializer',
'services/Initializers/EditModuleInitializer',
'services/Sandboxes/ModulesNavigationSandbox',
'services/Sandboxes/ApplicationStateSandbox', 'DataModel/Constants' ],
function($, _, Backbone, Router, MainFrameInitializer,
FlowsViewsInitializer, EditModuleInitializer, ModulesNavigationSandbox,
ApplicationStateSandbox, Constants) {
var initialize = function() {
// Pass in our Router module and call it's initialize function
MainFrameInitializer.initialize();
FlowsViewsInitializer.initialize();
EditModuleInitializer.initialize();
ApplicationStateSandbox.startCheckStatus();
ModulesNavigationSandbox.navigate(Constants.Modules.Home);
// Router.initialize();
};
return {
initialize : initialize
};
});
在我优化项目之前,一切都正常。我已经发现,在优化之前脚本开始运行,而DOM还没有准备好,这在优化之前是不正确的。无论如何,我希望使用domReady插件来确保首先加载DOM。
但是,显然,我不知道如何正确地做到这一点。这是main.js的新版本:
require.config({
paths : {
loader : 'libs/backbone/loader',
jQuery : 'libs/jquery/jquery-module',
Underscore : 'libs/underscore/underscore-module',
Backbone : 'libs/backbone/backbone-module',
templates : '../Templates'
}
});
require([ 'domReady', 'app' ], function(domReady, app) {
domReady(app.initialize);
});
非常整洁,但是有问题,因为在DOM准备好之前,
app
与domReady
同时加载。
我该如何解决这个问题?
谢谢。
编辑
我认为我已经理解了我们的问题。 app
依赖项的构造函数不应运行任何依赖于DOM的代码。它们只应返回函数,捕获依赖于DOM的逻辑。该逻辑应从app.initialize
执行,这保证在DOM准备就绪时运行。
domReady
和app
是错误的?只有在 DOM 准备好时才会实际调用app
中的代码。或者我误解了吗? - Paul Grimeapp
涉及到加载所有应用程序的依赖项(而且有相当多),然后调用这些依赖项并将结果传递给应用程序工厂方法,该方法返回app
本身。如果我理解正确,app
的依赖关系与domReady
同时执行,这意味着它们可能在DOM完全加载之前运行。 - markdefine()
的工厂函数实际运行代码,否则没有任何东西会运行。通常,工厂函数只是创建一个对象,该对象包含可以在将来某个时间点调用的方法(你已经做到了这一点)。因此,即使对define()
的调用将运行工厂函数,但只有当你想要进行真正的应用程序工作时才会执行。就像你通过将app.initialize
传递给domReady
函数所做的那样。在我看来,这很好。 - Paul Grime