【发布时间】:2013-05-11 07:22:48
【问题描述】:
这是我在使用 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
};
});
在我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调用代码。还是我误会了? -
可能是我误解了这些东西的工作原理。加载
app涉及加载所有应用程序依赖项(并且有很多),然后调用这些依赖项并将结果传递给应用程序工厂方法,该方法返回app本身。如果我理解正确的话,app的依赖与domReady并行执行,这意味着它们可能在 DOM 完全加载之前运行。 -
没有任何东西运行,除非你传递给
define()的工厂函数实际运行代码。通常,工厂函数只是创建一个对象,其方法可以在在将来的某个时间点调用(你已经这样做了)。因此,即使调用define()将运行工厂函数,您也只能在需要时执行真正的 应用程序工作。就像您通过将app.initialize传递给domReady函数所做的那样。我觉得很好。 -
我已经编辑了我的帖子。是这个意思吗?
标签: javascript requirejs domready