dojo.requireIf不允许局部变量

时间:2009-12-14 06:37:47

标签: dojo

我一直在尝试将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

2 个答案:

答案 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加载器,那么这不是问题。此外,将模块模块名称作为属性附加在公共可见模块上也可以避免此问题。