ExtJS 4.1 停止 grid.Panel 关闭
题
我有我的观点延伸 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();
解决方案
beforeclose
事件应该有效。不?
更新:
如果您想进行一些用户交互(即确认问题或保存数据或类似的问题)这会有点棘手......
首先,在视图的构造函数中执行如下操作:
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,但有一些标志和条件可以在没有确认的情况下经历相同的逻辑。
其他提示
我使用的技术只是隐藏窗口,而不是默认销毁窗口,并添加一个 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
});
也许不需要重型建筑。以下内容对我来说非常完美:
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;
}
不隶属于 StackOverflow