我一直在尝试将dojo.require(If)
与局部变量一起使用,以根据条件在页面上动态加载模块。
// note: dojo v1.4 djConfig = { debugAtAllCosts: true };
示例1(不起作用):
(function() { var nameOfClass = "Two"; dojo.require("my.namespace." + nameOfClass); dojo.addOnLoad(function() { var oneOrTwo = new my.namespace[nameOfClass](); }); }());
错误:ReferenceError:未定义nameOfClass。
示例2(不起作用):
(function() { var nameOfClass = "Two"; dojo.requireIf(nameOfClass == "One", "my.namespace.One"); dojo.requireIf(nameOfClass == "Two", "my.namespace.Two"); dojo.addOnLoad(function() { var oneOrTwo = new my.namespace[nameOfClass](); }); }());
错误:ReferenceError:未定义nameOfClass。
示例3(正常):
(function() { window.nameOfClass = "Two"; dojo.requireIf(window.nameOfClass == "One", "my.namespace.One"); dojo.requireIf(window.nameOfClass == "Two", "my.namespace.Two"); dojo.addOnLoad(function() { var oneOrTwo = new my.namespace[nameOfClass](); }); }());
出于某种原因,似乎require和requireIf只允许其中的全局变量。这是当前的限制,还是我只是做错了什么?
更新1 :
因此,如果我理解你(@Maine,@ jrburke),这是debugAtAllCosts的限制吗?如果上面的代码构建为跨域(添加xd文件前缀/后缀)并执行 - 它将按预期工作?
如果是这种情况,那么在不进行实际构建的情况下,本地测试将作为跨域执行的代码的正确方法是什么?
这也让我质疑预解析dojo.require(s)的动机。如果loader_xd不会(或者更确切地说不能)预解析,为什么为测试/调试创建的方法会这样做呢?
更新2 :
由于上述更新1中的两个问题与此问题并不密切相关,因此我将其移至separate discussion。
答案 0 :(得分:1)
这是因为requireIf
首先用正则表达式解析,并在正常程序流程之前执行。
如果你要为requireIf grep dojo源代码,你应该找到这种处理它的行(loader_xd.js):
var depRegExp = /dojo.(require|requireIf|provide|requireAfterIf|platformRequire|requireLocalization)\s*\(([\w\W]*?)\)/mg;
然后在全局范围内使用eval
执行该条件,而不是正常流程的一部分。
答案 1 :(得分:1)
为了澄清Main所说的更多内容,这是Dojo中XD加载器的问题。 debugAtAllCosts:true使用XD Loader。如果您只使用没有debugAtAllCosts的普通Dojo加载器,那么这不是问题。此外,将模块模块名称作为属性附加在公共可见模块上也可以避免此问题。