我试着做一个简单的任务。此任务是将HTML dijit.Form加载到ContentPane中。在加载这个HTML之前,我不知道需要哪个dijit,但是加载的HTML将包含适用的require来加载它们。
因此,为了能够从加载的HTML中执行脚本,我使用了dojox.layout.ContentPane。但是,当我将parseOnLoad设置为true时,解析会在脚本执行之前进行,所以第一次加载内容时dijit是不可用的。另外,当我尝试使用onDownloadEnd回调时,当这个回调运行时,require的dijit仍然没有加载。
我自己唯一能想到的就是使用setTimeout将解析推迟到执行这些脚本的时候。不过,我不喜欢这个解决方案,因为它有时会失败,这会使应用程序不那么负责任。
那么,我应该如何执行解析,以便在运行加载的require语句之后立即发生呢?
发布于 2012-09-22 20:28:12
我可以看到两种可能的解决方案--都使用dijit/layout/ContentPane。
data-config属性中编辑:我刚刚想到编写一个auto需求(对于Dojo <1.8)只是为了添加一个简短的getDependencies()方法,所以您不需要像上面的第二个选项中提到的那样列出依赖关系:
function getDependencies(/*DOMNode*/ containerNode) {
var deps = [];
query("[data-dojo-type]", containerNode).forEach(function(node) {
var dep = node.dataset.dojoType.split(".").join("/");
if(!~array.indexOf(deps, dep)) {
deps.push(dep);
};
});
return deps;
}看到它在jsFiddle:http://jsfiddle.net/phusick/hnjWt/上工作
发布于 2012-09-22 19:06:00
唯一的选项是在代码中设置dojoConfig.async = false或在require语句中设置。
由于这个原因,没有加载模块;虽然仍在下载模块,但必需()不阻塞解析器运行。
有关此示例的运行,请参见http://jsfiddle.net/zA9cJ/1/。
require(["dojox/layout/ContentPane", "dojo/domReady!"], function(pane) {
var p = new pane({ parseOnLoad: true, executeScripts: true }, 'container');
var content = '<script type="text/javascript">'+
'require('+
//////////////////////////
'{async:false},'+ ////////
//////////////////////////
'["dijit/form/Button"]);'+
'<'+'/script>'+
'<div data-dojo-type="dijit.form.Button">Button</div>';
p.set("content", content);
});https://stackoverflow.com/questions/12545899
复制相似问题