Extjs 4.1 STOP GRID.Panel от закрытия
Вопрос
У меня есть я считаю, что расширяет Ext.grid.Panel
, и я хочу иметь возможность попросить пользователя, если он действительно хочет закрыть панель после того, как он нажимает [x].Я пытался с
listeners: {
beforedestroy: function() {
//console.log('In');
return false;
}
},
.
Но очевидно, это не так просто.Любые идеи о том, как предотвратить закрытие панели?
Спасибо
leron
p.s.
Это то, что я получаю от форумов 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;
}
.
Идея - вы возвращаете ложь немедленно, но имейте некоторый флаг и условие, чтобы пройти через одну и ту же логику без подтверждения.
Другие советы
Техника, которую я использую, просто чтобы сделать окно спрятаться, а не по умолчанию Уничтожить окно и добавить слушатель события Forhidide.Это предотвращает, чтобы все компоненты в вашем окне, которые вы хотите предотвратить уничтожение, все равно уничтожаются.Событие 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;
}
.