dojo dijit.Dialog破坏了底层错误

Ash*_*ley 2 javascript dojo dialog

我有一个扩展dijit.Dialog的类,但只为我的站点设置默认功能和按钮.单击对话框的取消按钮时,将运行以下代码:

    this.actionDialog.destroyRecursive();
    this.actionDialog.destroy();
Run Code Online (Sandbox Code Playgroud)

NB this.actionDialog = dijit.Dialog

有时(并非总是)会抛出以下错误:

Uncaught TypeError: Cannot call method 'destroy' of undefined
DialogUnderlay.xd.js:8
Run Code Online (Sandbox Code Playgroud)

这导致以下对话框错误显示.我使用的是Google API的1.5.我错过了底衬代码吗?

肯的​​回答后抛出错误:

exception in animation handler for: onEnd
TypeError: Cannot read property 'style' of null
Run Code Online (Sandbox Code Playgroud)

两者都来自dojo.xd.js:14.但代码仍能正常运行.

Ken*_*iro 5

我仍然不完全确定问题是什么,除了某些原因dijit.DialogUnderlay代码变得混乱.FWIW,这在Dojo 1.6中不会发生.

当我在寻找一些可能的解决方案时,我似乎意外地发现避免这个问题可能就像hide()在破坏它之前立即调用对话框一样简单,例如:

this.actionDialog.hide();
this.actionDialog.destroyRecursive();
Run Code Online (Sandbox Code Playgroud)

或者,您可能有兴趣隐藏对话框,然后在隐藏动画完成后销毁它.

以下是如何在Dojo 1.5及更早版本(测试1.3+)上执行此操作:

dlg.connect(dlg._fadeOut, 'onEnd', function() {
    this.destroyRecursive();
});
dlg.hide();
Run Code Online (Sandbox Code Playgroud)

在1.6中,fadeOut动画不再在实例上公开(被授予,无论如何它在技术上都是私有的),但是onHide现在一旦动画结束就会触发(而在它开始之前就触发它).不幸的是,需要使用setTimeout来解决由于分支调用中的其他代码而发生的错误,该错误onHide假定实例上仍然存在某些东西,在我们销毁之后它们不会出现(参见#12436).

dlg.connect(dlg, 'onHide', function() {
    setTimeout(function() { dlg.destroyRecursive(); }, 0);
});
dlg.hide();
Run Code Online (Sandbox Code Playgroud)

在JSFiddle上看到它的实际操作:http://jsfiddle.net/3MNRu/1/ (请参阅问题中原始错误的初始版本)