Javascript 如何在解析的DojoContentPane中使用dijit requires

Javascript 如何在解析的DojoContentPane中使用dijit requires,javascript,ajax,dojo,js-amd,Javascript,Ajax,Dojo,Js Amd,我正在努力做一件简单的工作。此任务是将包含dijit.Form的HTML加载到ContentPane中。我不知道加载此HTML之前需要哪些DIJIT,但加载的HTML将包含加载它们所需的适用的require 因此,为了能够从加载的HTML执行脚本,我使用了dojox.layout.ContentPane。但是,当我将parseOnLoad设置为true时,解析在脚本执行之前进行,因此首次加载内容时dijit不可用。另外,当我尝试使用onDownloadEnd回调时,当运行此回调时,require

我正在努力做一件简单的工作。此任务是将包含
dijit.Form
的HTML加载到
ContentPane
中。我不知道加载此HTML之前需要哪些DIJIT,但加载的HTML将包含加载它们所需的适用的
require

因此,为了能够从加载的HTML执行脚本,我使用了
dojox.layout.ContentPane
。但是,当我将
parseOnLoad
设置为
true
时,解析在脚本执行之前进行,因此首次加载内容时dijit不可用。另外,当我尝试使用
onDownloadEnd
回调时,当运行此回调时,
require
中的dijit仍然没有加载

我唯一能想到的就是使用
setTimeout
将解析延迟到执行这些脚本的时间。但是,我不喜欢这个解决方案,因为它可能会不时失败,这会使应用程序不那么负责


因此,我应该如何执行解析,以便在运行加载的HTML中的
require
语句之后立即执行解析?

唯一的选项是将dojoConfig.async设置为false或在代码中的require语句中设置

因此,模块未加载;require()不会阻塞—并且在它仍在下载模块时—解析器会运行

请参阅以获取此示例的运行示例

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);
});​
require([“dojox/layout/ContentPane”,“dojo/domReady!”),函数(窗格){
var p=新窗格({parseOnLoad:true,executeScripts:true},'container');
变量内容=“”+
'需要'('+
//////////////////////////
“{async:false},”+////////
//////////////////////////
“[“dijit/form/Button”];”+
''+
“按钮”;
p、 设置(“内容”,内容);
});​

您唯一的选择是设置dojoConfig.async=false或在代码中的require语句中设置

因此,模块未加载;require()不会阻塞—并且在它仍在下载模块时—解析器会运行

请参阅以获取此示例的运行示例

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);
});​
require([“dojox/layout/ContentPane”,“dojo/domReady!”),函数(窗格){
var p=新窗格({parseOnLoad:true,executeScripts:true},'container');
变量内容=“”+
'需要'('+
//////////////////////////
“{async:false},”+////////
//////////////////////////
“[“dijit/form/Button”];”+
''+
“按钮”;
p、 设置(“内容”,内容);
});​

我可以看到两种可能的解决方案-都使用dijit/layout/ContentPane:

  • 使用Dojo 1.8.0,由于解析器支持,它将加载依赖项本身,如您在此处所见:

  • 将依赖项列表放在表单模板的某个位置,例如在
    dijit/form/form
    data config
    属性中:

    <form 
        data-dojo-type="dijit.form.Form" 
        data-config='"deps":["dijit/form/Form", "dijit/form/TextBox", "dijit/form/Button"]'>
    
        <input data-dojo-type="dijit.form.TextBox" data-dojo-props="placeholder:'TextBox'">
        <button data-dojo-type="dijit.form.Button">Button</button>
    
    </form>
    

  • 编辑:我刚想到编写一个自动程序需要(对于Dojo,我可以看到两种可能的解决方案-都是使用dijit/layout/ContentPane:

  • 使用Dojo 1.8.0,由于解析器支持,它将加载依赖项本身,如您在此处所见:

  • 将依赖项列表放在表单模板的某个位置,例如在
    dijit/form/form
    data config
    属性中:

    <form 
        data-dojo-type="dijit.form.Form" 
        data-config='"deps":["dijit/form/Form", "dijit/form/TextBox", "dijit/form/Button"]'>
    
        <input data-dojo-type="dijit.form.TextBox" data-dojo-props="placeholder:'TextBox'">
        <button data-dojo-type="dijit.form.Button">Button</button>
    
    </form>
    

  • 编辑:我刚想到编写一个auto需要(对于Dojo+1用于重写OP的应用程序逻辑,对于放弃dojox.layout.ContentPane.executeScripts:)+1用于重写OP的应用程序逻辑,对于放弃dojox.layout.ContentPane.executeScripts:)