Dojo.js AMD 加载程序 - 类型错误:无法将未定义转换为对象

Posted

技术标签:

【中文标题】Dojo.js AMD 加载程序 - 类型错误:无法将未定义转换为对象【英文标题】:Dojo.js AMD Loader - TypeError: can't convert undefined to object 【发布时间】:2013-02-07 18:21:08 【问题描述】:

我查找了重复的问题,但没有准确找到。这个和Dojo require() and AMD (1.7)有关,不过我会以提问的形式提问。问题是,为什么我会收到这个错误,为什么 dijit 在 firebug 中显示“3”?

JSP 页面

<script type="text/javascript" src="<%= request.getContextPath() %>/js/dojoConfig.js"></script>
<script type="text/javascript"
src="http://xxxxxxxxxxxxx.com/dojo/1.7.2/dojo/dojo.js.uncompressed.js"></script>
<script type="text/javascript" src="<%= request.getContextPath() %>/js/reviewframe.js"></script>

dojoConfig.js

var dojoConfig = 
// Use the Asynchronous AMD loader.
// --------------------------------
async : true,
// Use debug.
// --------------------------------
isDebug : true,
// Parse the html on load for dojo rendered elements.
// Don't Parse on Load. I'm calling it manually in my main pageLoad.
// --------------------------------
parseOnLoad : false,
;

reviewframe.js(我的“主要”)

require(
[ "dojo", "dijit", "dojo/parser", "js/XYDialog.js",
"dijit/layout/ContentPane", "dojox/image/LightboxNano", "dojo/ready",
"dojo/domReady!" ],
function(dojo, dijit, parser, XYDialog) 

XYDialog.js

define([ "dojo", "dijit", "dijit/form/Button", "dijit/TooltipDialog",
    "dijit/form/DropDownButton", "dijit/form/FilteringSelect" ], function(
    dojo, dijit) 

我在上面定义的 XYDialog.js 中设置了一个断点。我点击继续,我在控制台中收到此错误:

控制台

focus.js line 382
TypeError: can't convert undefined to object [Break On This Error]  ...attr] = typeof singleton[attr] == "function" ? lang.hitch(singleton, attr) : sin...

如果我在 focus.js 中在那一行之前设置一个 Firebug 断点,我会看到 dijit 是数字 3。为什么?我以前在其他地方看到过这种情况,我需要的 javascript 或模块最终是数字 3。

编辑: 我的天啊,我关闭了 Firefox 并加载了没有萤火虫的页面。有用!然后我打开了萤火虫,清除了所有断点,它又可以工作了。嘘。

后续问题: firebug 中的断点会破坏 AMD 加载程序吗?毕竟是异步的。您的断点可能会引入时间问题...

【问题讨论】:

【参考方案1】:

这里有两个问题:

    您正在使用文件名而不是模块 ID (XYDialog.js) 加载 AMD 模块,因此它被视为非 AMD 模块并被加载。你应该把它放在一个逻辑包中,或者在你的配置中定义路径,例如:

    文件结构:

    /js/foo/XYDialog.js
    /js/dojo/dojo.js
    

    代码:

    // reviewframe.js (My 'main')
    
    require(
    [ "dojo", "dijit", "dojo/parser", "foo/XYDialog",
    

    神秘代码“3”通常表示包的路径不正确。我相信第一个问题,结合 Firebug,可能会不一致地给你这个错误。

请参阅http://www.sitepen.com/blog/2012/10/31/debugging-dojo-common-error-messages/#incorrect-package-path 下的注释(本文是我们撰写的一篇文章,可帮助您确定使用 Dojo 和 AMD 时最常见错误消息的原因)。

【讨论】:

这个答案充满了善良。我认为我正在做的事情是合法的并且受到 dojo AMD 加载程序的支持,但你是对的 - 我可以将我的代码转换为模块作为最佳实践。至少我通过使用闭包来使用伪 OO js。【参考方案2】:

重启 Firefox 并清除 Firebug 中的断点。

【讨论】:

以上是关于Dojo.js AMD 加载程序 - 类型错误:无法将未定义转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从AMD dojo创建构建

当通过ajax加载dojo.js多次得到错误:defineAlreadyDefined

IBM Worklight 6.0 - dojo.js:21 中的 scriptError

难以将 xstyle 作为 dojo 依赖项加载

Zend 框架中的 Dojo 对话框错误

我的 IBM Domino xPages 应用程序中的 dojo.js 导致某些 JS 库无法工作