我有一个自定义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>
提前致谢!
答案 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加载器工作,当标准加载器在这种情况下失败时,我很乐意接受这个答案。否则,我会接受我的回答,因为它确实解决了问题。