Dojo 当dijit表单具有DateTextBox时,无法获取对该表单的引用

Dojo 当dijit表单具有DateTextBox时,无法获取对该表单的引用,dojo,dijit.form,Dojo,Dijit.form,当表单包含DateTextBox时,我很难获得对dijit表单小部件的引用。下面的代码片段演示了这个问题。执行时,警报框显示“未定义”。但是,如果我去掉,我就能够获得对表单小部件的引用 <!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf-8"> <title></title> <link rel="

当表单包含DateTextBox时,我很难获得对dijit表单小部件的引用。下面的代码片段演示了这个问题。执行时,警报框显示“未定义”。但是,如果我去掉
,我就能够获得对表单小部件的引用

<!DOCTYPE HTML>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/dojo/1.9.1/dijit/themes/claro/claro.css" media="screen">

        <!-- load dojo and provide config via data attribute -->
        <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/dojo/1.9.1/dojo/dojo.js"
            data-dojo-config="async: true, parseOnLoad: true">
        </script>
        <script type="text/javascript">
            require(["dijit/form/TextBox", "dijit/form/DateTextBox"]);
        </script>

        <script type="text/javascript">
            require(["dojo/parser", "dijit/registry", "dijit/form/Form", "dojo/domReady!"],
            function(parser, registry) {
                parser.parse();
                alert(registry.byId("frm_test"));
            });
        </script>
    </head>

    <body class="claro">
        <div data-dojo-type="dijit/form/Form" id="frm_test" encType="multipart/form-data" action="" method="">  
            <input type="text" id="textBox" name="textBox" data-dojo-type="dijit/form/TextBox" />
            <input type="text" id="dateTextBox" name="dateTextBox" data-dojo-type="dijit/form/DateTextBox" />
        </div>
    </body>
</html>

要求([“dijit/form/TextBox”,“dijit/form/DateTextBox”]);
require([“dojo/parser”、“dijit/registry”、“dijit/form/form”、“dojo/domReady!”),
函数(解析器、注册表){
parser.parse();
警报(registry.byId(“frm_测试”);
});

我建议将
注册表.byId
包装成一个
ready
调用

保留
parse onLoad:true
,删除

require(["dijit/form/TextBox", "dijit/form/DateTextBox"]); 
正如解析器将自动要求的那样(当dojo>=1.8时),并使用以下命令:

<script type="text/javascript">
    require(["dojo/ready", "dijit/registry", "dojo/domReady!"],
        function(ready, registry) {
            // by default the prioirty of this ready call will be after the 
            // ready call used to parse when parseOnLoad is true
            ready(function() { 
                alert(registry.byId("frm_test"));
            });
    });
</script>

require([“dojo/ready”、“dijit/registry”、“dojo/domrready!”),
功能(就绪,注册表){
//默认情况下,此就绪调用的优先级将在
//当parseOnLoad为true时用于解析的就绪调用
就绪(函数(){
警报(registry.byId(“frm_测试”);
});
});

注意,等待dojo/domReady!开火往往是不够的 使用小部件时。许多小部件不应该初始化或删除 在加载并执行以下模块之前访问:

  • dojo/uacss
  • dijit/hccss
  • dojo/解析器
因此,在使用小部件时,通常应该将代码 dojo/ready()回调的内部


您正在解析两次。如果设置了
parseOnLoad:false
,问题是否仍然存在?是的,如果将parseOnLoad设置为false,问题仍然存在。出于某种原因,registry.byId在这里不起作用,除非我进行手动解析,但这是另一个问题。我不知道我的答案是否能解决您的问题,但我建议您将registry.byId包装在就绪回调中,这一建议起到了作用。现在我了解了问题所在,我想发布一段dojo文档的摘录,以方便可能有相同问题的其他人:“注意等待dojo/domReady!在使用小部件时,仅激发通常是不够的。许多小部件在以下模块加载和执行之前不应该初始化或访问:dojo/uacss dijit/hccss dojo/parser因此,在使用小部件时,通常应该将代码放在dojo/ready()回调中“谢谢你的其他建议。我没有意识到手动要求模块已不再必要。当
parseOnLoad
设置为
true
时,似乎仍然需要手动输入“dojo/parser”。