【问题标题】:Dojo dialog close event on X (top-right)X 上的 Dojo 对话框关闭事件(右上角)
【发布时间】:2012-04-27 17:54:59
【问题描述】:

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

Tried to register widget with `id==user_submit` but that `id` is already registered

user_submit,是一个 Dojo 按钮,我必须在对话框中完成表单。当我通过单击它并提交表单关闭对话框时,再次打开对话框没有问题(在按钮上的单击事件中,我有这行代码:

dijit.byId("user_submit").destroy();

但是如果我通过右上角的 [x]-link / 按钮关闭对话框,我不会破坏按钮,然后在不重新加载页面的情况下无法再次打开对话框。

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

【问题讨论】:

    标签: javascript button dojo dialog


    【解决方案1】:

    "Developer shouldn't override or connect to this method"“onCancel”见documentation。 更好的解决方案是:

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

    【讨论】:

    • 您有可以与提问者分享的文档链接吗?
    • dojotoolkit.org/api 搜索dijit/Dialog,看构造方法,我们传入params & srcNode
    • 它不起作用。 dijit/Dialog.js 中甚至没有 hide() 函数。
    • 这对我有用。关于如何将对话框传递给外部函数的任何提示?例如var dialog = new Dialog({ content: form, title: title, onHide: customFunction(dialog)});。我应该通过dialogthis 还是什么?
    【解决方案2】:

    找到了解决办法。通过使用 dojo.connect()。

    myDialog.connect(myDialog, "hide", function(e){
        dijit.byId("user_submit").destroy(); 
    });
    

    在我发布问题后不久就会发布这个,但我没有足够的积分,所以这里再次给出答案,只是有点晚了:-)

    【讨论】:

    • 谢谢!工作完美!对于那些在对话框中有内容的人,不要忘记添加dijit.byId("user_submit").destroyDescendants(); !!!!
    • 推荐的销毁方式是destroyRecursive
    • 后期评论:连接到“onHide”而不是“hide”可能更好。 “onHide”发生在任何动画执行之后,所以如果想要在对话框隐藏时销毁对话框,“onHide”会比“hide”更安全。对话框的 hide() 方法启动隐藏对话框的过程,但如果启用了动画,则会执行这些动画,其中 hide() 使用承诺在动画完成时触发“onHide”。
    【解决方案3】:

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


    您也可以考虑完全回避这个问题。也许您不需要销毁小部件,而是可以重复使用相同的小部件?您还可以在再次创建它之前进行小部件存在测试,如果旧版本仍然存在,则将其销毁。

    【讨论】:

    • 我连接到“隐藏”事件并且工作(不久之后,但没有足够的分数来快速发布我自己的问题的答案)。但事实上,在优化脚本时,我会按照你说的做。但由于我是 Dojo 新手,而且“项目”必须快速完成,所以我没有时间考虑资源管理。
    【解决方案4】:

    您可以如上所述覆盖onCancel() 方法,也可以将事件附加到 dijit.dialog.closeButtonNodedomElement。 dijit.dialog.closeButtonNode 是关闭按钮的data-dojo-attach-point 属性的名称。

    经验:

    dojo.on(dijit.Dialog.closeButtonNode, "click", function(evt){
          //add your logic here
    });
    

    【讨论】:

      【解决方案5】:

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

      在那里处理元素。

      【讨论】:

      • “开发人员不应覆盖或连接到此方法;它是 TooltipDialog 和打开它的事物之间的私有通信设备(例如:dijit/form/DropDownButton)” - Dojo API 文档 @987654321 @ > Dijit > _DialogMixin > onCancel
      猜你喜欢
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2013-01-28
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多