dojo.requireIf不允许局部变量(dojo.requireIf does not allo

2019-10-18 16:53发布

我一直在尝试使用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]();
  });
}());

出于某种原因,它看起来好像需要和requireIf只允许在他们里面的全局变量。 那是一个电流限制,还是我只是做错了什么?


更新1:

因此,如果我理解你(@Maine,@jrburke)正确,这是debugAtAllCosts的限制? 如果上面的代码被编译为跨域(添加XD文件前缀/后缀),并执行 - 如预期,将工作?

如果是这样的话,那么什么是本地测试,将跨域被执行的代码,未做实际构建的正确方法?

这也让我质疑预解析考虑dojo.require(S)的动机。 如果loader_xd不会(或者说不可能)预解析,为什么是方法,以用于测试/调试这样创造出来的?

更新2:

由于在更新1以上没有与之密切相关的一个两个问题,我搬到他们出到一个单独讨论 。

Answer 1:

这是因为requireIf s的用正则表达式的第一件事解析,正常的程序流程之前执行。

如果你会用grep的requireIf道场源,你会发现这种线的处理它(loader_xd.js):

var depRegExp = /dojo.(require|requireIf|provide|requireAfterIf|platformRequire|requireLocalization)\s*\(([\w\W]*?)\)/mg;

的条件,然后用执行eval在全球范围内,而不是一般的流的一部分。



Answer 2:

为了澄清更多的什么主说,这是在道场的XD装载机的问题。 debugAtAllCosts:真正使用XD装载机。 如果你只是用普通道场装载机没有debugAtAllCosts,这不是一个问题。 此外,附加的模块模块名作为属性公开可见的模块上也避免了这个问题。



文章来源: dojo.requireIf does not allow local variables
标签: dojo