Javascript 如果DebugatalCosts为false,为什么在Dojo中加载自定义小部件会失败,如果为true,为什么加载会成功?

Javascript 如果DebugatalCosts为false,为什么在Dojo中加载自定义小部件会失败,如果为true,为什么加载会成功?,javascript,dojo,Javascript,Dojo,我有一个自定义dijit,当debugAtAllCosts=true时加载良好,但当debugAtAllCosts=false时加载失败,出现以下错误: failed loading script/dojo15root/dojo/../../widget/DatePicker.js with error: TypeError: dojo.body() is undefined 我知道使用debugAtAllCosts=true使dojo使用XD加载程序,该加载程序异步加载模块。所以当人们

我有一个自定义dijit,当debugAtAllCosts=true时加载良好,但当debugAtAllCosts=false时加载失败,出现以下错误:

 failed loading script/dojo15root/dojo/../../widget/DatePicker.js 
 with error: TypeError: dojo.body() is undefined
我知道使用debugAtAllCosts=true使dojo使用XD加载程序,该加载程序异步加载模块。所以当人们从同步加载程序转到异步加载程序时,通常会遇到问题。当小部件可以用异步加载程序加载,但不能用同步加载程序加载时,我应该寻找什么样的bug

我可以发布代码,但它由许多不同的js文件和其他小部件组成,这也可能是问题所在。所以在这一点上,我试图通过找出这个问题何时可能发生来缩小问题的范围

小部件无法加载时的My djConfig:

<script type="text/javascript">
    var djConfig = {
        parseOnLoad: true,
        isDebug: true,
        locale: 'en-us',
        debugAtAllCosts:false,
        modulePaths:{'widget':'../../widget','datepicker':'../../datepicker'}
    };
</script>
小部件加载时的My djConfig:

<script type="text/javascript">
    var djConfig = {
        parseOnLoad: true,
        isDebug: true,
        locale: 'en-us',
        debugAtAllCosts:false,
        modulePaths:{'widget':'../../widget','datepicker':'../../datepicker'}
    };
</script>

提前谢谢

在阅读了不同的加载程序策略之后,我认为我的问题必须是在加载文件之前在一些javascript代码中实例化dijit

事实证明,这里有一条令人不快的线:

dojo.provide("widget.DatePicker");

dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.require("dijit.Dialog");

dojo.declare("widget.DatePicker", [dijit._Widget, dijit._Templated],  {

    ...

    //private fields
    _dialogBox:new dijit.Dialog({
        title: "Warning!"
    }),

    ...

});
我通过将实例化移动到postCreate函数中来修复它,以确保小部件和所有需求都将被加载

我仍然不能100%确定为什么标准加载器会出现这个问题,因为据我所知,它是同步加载的;而XD加载程序是异步加载的。我的猜测是,在小部件生命周期中,小部件属性是在加载小部件的属性之前创建的。但这并不能解释为什么XD加载器会在这种情况下工作

如果有人能解释为什么XD加载器工作,当标准加载器在这种情况下失败时,我很乐意接受这个答案。否则,我会接受我的答案,因为它确实解决了问题