2009-12-14 62 views
0

我一直试图使用dojo.require(If)与本地变量动态加载页面上的模块基于条件。dojo.requireIf不允许本地变量

 
// 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以上没有与之密切相关的一个两个问题,我搬到他们出到separate discussion

回答

1

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

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

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

条件,然后在全球范围内与eval执行,而不是作为正常流量的一部分。

1

为了阐明Main的更多内容,这是Dojo中的XD loader的一个问题。 debugAtAllCosts:true使用XD Loader。如果您只使用没有debugAtAllCosts的普通Dojo加载器,则不是问题。另外,将模块模块名称作为属性附加到公共可见模块上也可避免此问题。

+0

谢谢@jrburke,但使用普通的dojo加载器将不允许测试代码的行为,因为它将在xd构建之后执行;因为前者将使用同步xhr来检索dojo.require [s],而不是使用异步“脚本”(loader_xd)。 – 2009-12-17 15:19:10