ExtJS 4:模式窗口上的消息确认框问题

Posted

技术标签:

【中文标题】ExtJS 4:模式窗口上的消息确认框问题【英文标题】:ExtJS 4: Problems with Message confirmation box on a modal window 【发布时间】:2014-05-15 03:25:30 【问题描述】:

我目前面临一个对于 ExtJS 或 javascript 用户来说似乎很常见的问题。由于消息确认框的异步性质,我面临一个问题。我试图在许多论坛上找到解决方案,但没有一个解决方案没有给我一个更简单的方法来处理以下问题。或者可能是我无法理解给出的提示。

下面是我的代码:

var modalWindow = new Ext.Window(
        id: 'modalWindow',
        ...
        ...
        listeners: 
            beforeclose: function ( window, eOpts )    
                if ( dirtyCheck() )
                    //perform abc()
                    // and don't close the modal window
                    return false;
                
                else 
                    //perform xyz()
                    // close the modal window
                    return true;
                
            ,
            close: function ( panel, eOpts )
                //will trigger beforeclose event to check if all is well
                //refresh screen
            

        ,
        buttons: [
            text: 'Close',
            handler: function () 
                modalWindow.close() // Same close() method is called when we click on window close ( X symbol ) tool.
            
        ]        
);

function dirtyCheck()
    // Code to check if dirty records exist
    if ( /* Found dirty records */ )
        Ext.MessageBox.confirm('Please Confirm', 'Changes not saved. Do you want to close   the window?', function (btn) 
            if (btn === 'yes') 
                console.log('*** clicked yes ****');
                window.close();
            
        );
    

案例描述: 我有一个网格,双击一个网格行会打开一个上面编码的模式窗口。我对模态窗口进行了一些修改。如果用户单击“关闭”按钮或模式窗口关闭工具(右上角的 X 符号)甚至 ESC 按钮,我应该提示确认消息。如果用户点击“是”,我应该关闭模式窗口,否则保持打开状态。

我了解到单击 X(关闭工具)或 ESC 按钮会触发“关闭”事件,该事件又会触发“关闭前”并等待真/假以破坏模式窗口或使其保持打开状态。

问题:当用户点击 X (close tol) 或 ESC 按钮时,当我调试时,我看到控件将转到 beforeclose,然后是我编写的dirtyCheck() 函数。 dirtyCheck 函数还显示一个消息确认框,但控件不会等待我单击是/否。它在后台返回到 beforeclose ,然后关闭。因此,当用户决定点击“是”或“否”时,ExtJS 已经决定如何处理模态窗口,因此我无法控制是否关闭模态窗口。

有人可以帮我解决这种情况该怎么办吗?

【问题讨论】:

我有同样的问题,但我找不到以下问题的解决方案,请让它解决你为这个问题做了什么? 我希望我能立即获得解决方案。在我掌握我使用的调整并将其粘贴到此处之前,请给我一些时间。 【参考方案1】:

您可能需要在确认后使用 window.destroy() 将其删除,您的 beforeClose 函数可以是

beforeclose: function(window, eOpts) 
      Ext.Msg.confirm('Please Confirm', 'Changes not saved. Do you want to close the window?', function(answer) 
          if (answer == "yes") 
              window.destroy();
          
      );
      return false;

【讨论】:

可能我无法直接应用您的建议。但似乎我可以通过利用 close() 和 destroy() 事件的差异找到解决问题的方法。很快就会更新你。 搞定了,伙计。谢谢你的主意。实际上,我在不同的地方使用了 close() 和 destroy() 的组合并让它工作。【参考方案2】:

将窗口传递给您的检查功能,并在用户做出选择后将其关闭。

var modalWindow = new Ext.Window(
    id: 'modalWindow',
    ...
    ...
    listeners: 
        beforeclose: function ( window, eOpts )    
            dirtyCheck(window);
            return false;
        ,
        close: function ( panel, eOpts )
            //will trigger beforeclose event to check if all is well
            //refresh screen
        

    ,
    buttons: [
        text: 'Close',
        handler: function () 
            modalWindow.close() // Same close() method is called when we click on window close ( X symbol ) tool.
        
    ]        
);

function dirtyCheck(window)
    // Code to check if dirty records exist
    Ext.MessageBox.confirm('Please Confirm', 'Changes not saved. Do you want to close   the window?', function (btn) 
    confirmation = true;
    if (btn === 'yes') 
        console.log('*** clicked yes ****');
        window.close();
    
    );

顺便说一句,您可以使用自己的方式,但您需要使用本机浏览器对话框,请参阅确认功能http://www.w3schools.com/js/js_popup.asp

【讨论】:

编辑了您的代码解决方案(错误地),而不是编辑我的原始代码 sn-p。对于那个很抱歉。来到您提供的解决方案,我发现那里有问题。让我知道我是否正确:当您在消息确认中说 window.close() 时,它不会触发 beforeclose() 事件吗?然后可能会继续进入一个连续的循环?

以上是关于ExtJS 4:模式窗口上的消息确认框问题的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 4.1:模态窗口似乎在提交窗口之前返回控制

jQuery确认对话模式 - 无法成功提交表单

qt弹出消息框程序继续运行

消息框显示方法上的 ExtJS callParent 不起作用

ExtJs弹出窗口

在javascript中的 弹出对话框或确认框或消息框中添加表格去显示信息?