这是我main.js:如何使用domready中requireJS使用domready中之前插件正确
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
};
});
一切工作正常,直到我optimize项目。我已经发现,在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);
});
非常整齐,非常错误的,因为app
装入平行domReady
之前DOM已准备就绪。
我该如何解决?
谢谢。
编辑
我想我已经明白我们的问题。 app
依赖项的构造函数不应该运行任何与DOM相关的代码。他们应该只是返回函数,捕获DOM依赖的逻辑。该逻辑应该从app.initialize
开始执行,当DOM准备就绪时,这将保证运行。
为什么'domReady'和'app'并行加载错了?当DOM准备就绪时,您只能从'app'调用代码。或者我误解了? – 2012-02-20 15:07:35
这可能是我误解了这些东西的工作原理。加载'app'涉及加载所有的应用程序依赖关系(并且有很多),然后调用这些依赖关系,并将结果传递给应用程序工厂方法,该方法返回'app'本身。如果我理解正确,'app'的依赖与'domReady'并行执行,这意味着它们可以在DOM完全加载之前运行。 – mark 2012-02-20 15:13:49
没有*运行*除非您传递给define()的工厂函数实际运行代码。通常情况下,工厂函数只是创建一个对象,其方法可以在将来的某个时刻调用*(您已经这样做了)。所以即使调用'define()'将会运行工厂函数,你只需要* real * app就可以工作。就像通过将'app.initialize'传递给'domReady'函数一样。对我来说似乎很好。 – 2012-02-20 15:29:30