【发布时间】:2012-05-17 07:13:23
【问题描述】:
我在 Dojo 1.7.2 中使用 AMD 加载器创建了如下所示的 Dojo 小部件
var myCpane;
require([
"dijit/layout/ContentPane"
], function(ContentPane) {
myCpane = new ContentPane();
});
myCpane.startup(); // It gives 'myCpane' as undefined
在上面的示例中,在最后一条语句中,变量“myCpane”以“未定义”的形式出现,如果我在“require()”回调函数中使用“myCpane.startup()”,它将起作用很好。
但我想在“require”函数之外使用那个“myCpane”变量(出于多种原因)。我知道由于 Dojo 的组件加载过程而延迟了 'require()' 回调函数的执行。
我的问题是,
- 如何阻止“require()”函数,直到它完成执行它的回调函数。
所以当控件从'require()'函数出来时,变量'myCpane'不会是'undefined'
================================================ =============
为了克服这个问题,我编写了一个小函数来加载模块并等待模块加载完成
LoadModule: function(modulePath) { // modulePath = "dijit/layout/ContentPane"
var moduleObject = undefined;
require({async: false}, [modulePath], function(getModuleObject) {
moduleObject = getModuleObject;
});
// Wait until the module loads completes
while(moduleObject === undefined);
// Return the loaded module.
return moduleObject;
}
函数的输出总是执行while循环,控件永远不会进入'require()的回调函数来设置变量“moduleObject”的值。
什么时候'require()'函数会调用它的回调函数?我已经使用浏览器调试器窗口验证了文件'ContentPane.js'已正确加载,但未调用回调函数,如果我注释while循环,则正确调用回调。
在我的情况下,控件何时会进入回调函数?
【问题讨论】:
-
这件事也难倒我,因为对我来说,这只是一种不同的思维方式。我接受了我需要了解更多关于 Javascript 的事实。我现在的想法是,我需要创建自己的控制器对象(这是一个接收对 Dojo 环境的必要引用的函数),然后我可以在其中执行我的代码,其中包含我需要的所有引用。跨度>