Javascript X上的Dojo对话框关闭事件(右上)

Javascript X上的Dojo对话框关闭事件(右上),javascript,button,dojo,dialog,Javascript,Button,Dojo,Dialog,我正在使用Dojo创建一个简单的对话框,以便在系统中创建用户。问题是我得到了错误: Tried to register widget with `id==user_submit` but that `id` is already registered user\u submit,是一个Dojo按钮,我必须在对话框中完成表单。当我通过单击对话框并提交表单来关闭对话框时,再次打开对话框没有问题(在按钮上的单击事件中,我有以下代码行: dijit.byId("user_submit").destro

我正在使用Dojo创建一个简单的对话框,以便在系统中创建用户。问题是我得到了错误:

Tried to register widget with `id==user_submit` but that `id` is already registered
user\u submit
,是一个Dojo按钮,我必须在对话框中完成表单。当我通过单击对话框并提交表单来关闭对话框时,再次打开对话框没有问题(在按钮上的单击事件中,我有以下代码行:

dijit.byId("user_submit").destroy();
但是如果我通过右上角的[x]-链接/按钮关闭对话框,我不会破坏按钮,然后在不重新加载页面的情况下无法再次打开对话框


如何让Dojo销毁按钮,或者如何重载[X]-link/button上的click事件,以便为按钮编写销毁命令?

IIRC,当您单击X对象时,会调用
onClose
扩展事件,因此您可以尝试将清理代码放在那里



你也可以考虑完全解决这个问题。也许你不需要破坏这个小部件,而可以重用同一个小部件。在你重新创建它之前,你也可以做一个小部件存在测试,如果它仍然存在,就破坏旧版本。

< p>找到一个解决方案。
在我发布请求后不久就会发布此消息,但我没有足够的分数,所以这里再次给出答案,只是有点晚了:-)

当按下对话框顶部的X时,“onCancel”事件被触发


在那里处置该元素

“开发人员不应重写或连接到此方法”
有关“onCancel”的信息,请参阅。 更好的解决方案是:

var myDialog = new Dialog({
   id: "myDialogId1",
   onHide: function() {
      myDialog.destroy()
   }
});

您可以按照上面所述重写
onCancel()
方法,也可以将事件附加到
dijit.dialog.closeButtonNode
DoElement。
dijit.dialog.closeButtonNode
是关闭按钮的
数据dojo附加点
属性的名称

经验:


我连接到了“隐藏”事件,这起到了作用(不久之后,但没有足够的分数将答案快速发布到我自己的问题上)。但事实上,当优化脚本时,我会照你说的做。但是由于我是Dojo的新手,而且“项目”必须快速完成,我没有时间考虑资源管理。你有可以与提问者共享的文档链接吗?搜索dijit/Dialog并查看构造函数方法,我们传递params&srcNodeIt不起作用。dijit/Dialog.js中甚至没有hide()函数。有关于如何将对话框传递给外部函数的提示吗?e、 g.
var dialog=newdialog({content:form,title:title,onHide:customFunction(dialog)})。我应该传递
对话框
这个
还是什么?“开发人员不应该覆盖或连接到这个方法;它是TooltipDialog和打开它的东西之间的私有通信设备(例如:dijit/form/DropDownButton)”-Dojo API documentation>dijit>\u DialogMixin>谢谢!工作得很好!对于那些在对话框中有东西的用户,不要忘记添加一个
dijit.byId(“user_submit”).destroy()!!!!建议的销毁方法是
destroyRecursive
latecomment:最好连接到“onHide”而不是“hide”。“onHide”发生在执行任何动画之后,因此如果要在对话框隐藏时销毁对话框,“onHide”将比“hide”更安全。对话框的hide()方法开始隐藏对话框的过程,但是如果启用了动画,则会执行这些过程,hide()使用一个承诺,在动画完成时触发“onHide”。
var myDialog = new Dialog({
   id: "myDialogId1",
   onHide: function() {
      myDialog.destroy()
   }
});
dojo.on(dijit.Dialog.closeButtonNode, "click", function(evt){
      //add your logic here
});