ExtJS 4.1阻止grid.Panel关闭

ExtJS 4.1阻止grid.Panel关闭,extjs,extjs4.1,Extjs,Extjs4.1,我的视图扩展了Ext.grid.Panel,我希望能够询问用户在单击[X]后是否真的想关闭面板。我试过了 listeners: { beforedestroy: function() { //console.log('In'); return false; } }, 但很明显,事情并没有那么简单。有没有关于如何防止面板关闭的想法 谢谢 勒

我的视图扩展了
Ext.grid.Panel
,我希望能够询问用户在单击[X]后是否真的想关闭面板。我试过了

listeners: {
            beforedestroy: function() {
                               //console.log('In');
                return false;
            }
        },
但很明显,事情并没有那么简单。有没有关于如何防止面板关闭的想法

谢谢

勒隆

附言

这是我从sencha论坛得到的,还没有测试过:

Ext.create( 'Ext.window.Window', {
    title: 'test',
    width: 200,
    height: 200,
    listeners: {
        beforeclose: function( window ) {
            Ext.Msg.confirm( 'Hey', 'Are you sure you want to close?', function( answer ) {
                if( answer == "yes" ) {
                    window.destroy();
                }
            } );
            return false;
        }
    }
} ).show(); 

在关闭之前
事件应该有效。没有

更新:

如果你想进行一些用户交互(如确认问题或保存数据等),这将有点棘手

首先,在视图的构造函数中执行以下操作:

this.on('beforeclose', function() { 
   return this.myCloseHandler(function() { this.close(); }, this);
});
this.alreadyAsked = false;
然后创建处理程序:

myCloseHandler: function(callback, scope) {
    if (this.alreadyAsked === false) {
        this.alreadyAsked = true;
        Ext.MessageBox.show({
            msg: 'Are you sure?',
            fn: function(btn) {
               if (btn == 'yes')
                  Ext.callback(callback, scope);
               else 
                  this.alreadyAsked = false;   
            }
        });
        return false;

    }
    return true;   
}

想法是-您立即返回false,但有一些标志和条件可以在没有确认的情况下通过相同的逻辑。

可能没有必要进行繁重的构造。以下作品非常适合我:

beforeclose: function(window) {
    Ext.Msg.confirm("Hey", "Are you sure you want to close?", function(answer) {
        if (answer == "yes") {
            window.events.beforeclose.clearListeners();
            window.close();
        }
    });
    return false;
}

我使用的技术只是执行窗口隐藏,而不是默认销毁窗口,并添加beforehide事件侦听器。这可以防止窗口中要防止销毁的所有组件被销毁。hide事件是一个非常无辜的事件。然后Ext.msg出现了,甚至可能只有在特定条件下才会出现。你对中断信息的回复完成了任务。否则不会造成伤害,因为返回false

var win = Ext.create('Ext.window.Window', {
       .... your window specs ...
       closeAction : 'hide',
       buttons : [{
            text    : 'Close',
            scope   : me,
            handler : function() {
                win.hide(); // not destroy !!! that comes later !!!
            }
        }],
        listeners : {
            scope  : me,
            'beforehide' : function(window) {
                if (some_condition == true) {
                    Ext.Msg.confirm( 'Confirm close of window', 'You really wanna close this window ?', function( answer ) {
                        if( answer == "yes" ) {
                            window.destroy();
                        }
                    });
                    return false;
                }

            },
            'destroy' : function(window) {
                  // do something after the window destruction //
                  alert('Another window smashed');
            }
        }
        ... rest of your window specs
  });

在用户关闭面板之前激发。从任何侦听器返回false以停止正在触发的关闭事件
这是我不理解的部分。似乎仅仅添加监听器不起作用,我需要从监听器或事件中
返回false
,以停止进一步执行,但这是我不知道如何实现的理论。这是关于监听器的sencha文档,我理解的是,我必须在监听器中触发一个事件,并从该事件中返回false,但我听上去有点困惑。我今天没有太多的时间去试验,但这似乎是一项标准任务,所以我试图找到一个现实生活中的解决方案,因为我发现的信息最让我困惑。你知道吗?没错。如果要停止关闭面板,则返回false。你到底想做什么?你的意思是你需要一些用户交互,然后可能关闭面板?嗯,现在我更困惑了:)无论如何,我尝试了sverel监听器,包括关闭前的
,但我上面的例子是,即使很难关闭,也不会停止,我返回false。但事实上,我需要的可能是你所说的
用户交互
我想在按下[x]时挂起操作,并显示一个确认框,询问用户是否确定要关闭面板,并且仅在按下“OK”时关闭面板,否则我想停止进一步执行并保持面板打开。