如果debugAtAllCosts为false,为什么在Dojo中加载自定义窗口小部件会失败,但如果为true则会成功?

时间:2011-06-09 15:19:04

标签: 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加载器,它异步加载模块。所以通常人们在从同步加载器转向异步加载器时会遇到问题。当小部件使用异步加载程序加载时,我应该寻找什么样的错误,但不加载同步加载器?

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

当小部件无法加载时我的djConfig:

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

小部件加载时我的djConfig:

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

在阅读了不同的加载器策略之后,我认为我的问题必须是在加载文件之前在一些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函数来修复它,以确保小部件和所有“require”都被加载。

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

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