Как закрыть модальные окна extjs при нажатии на маску?
Если я создаю модальное окно:
Ext.define('myWindow', {
extend: 'Ext.Container',
alias: 'widget.myWindow',
floating: true,
modal: true,
listeners:
'onMaskClick???': { close the window }
.....
}
Как узнать, когда пользователь нажал на маску за окном? В Sench Touch есть config hideOnMaskTap, который позволяет мне указать. Что такое event/config для extJS?
Ответы
Ответ 1
Трамвайный корпус (вроде) работает в модальных или немодульных окнах. Но не в том случае, если дочерние компоненты, такие как связанный список combobox, плавают за пределами окон.
Однако, если вы используете модальные окна в любом случае, вы можете прослушивать событие click на маске, как это.
Ext.define('myWindow', {
extend: 'Ext.window.Window',
alias: 'widget.myWindow',
floating: true,
modal: true,
initComponent: function () {
var me = this;
me.callParent(arguments);
me.mon(Ext.getBody(), 'click', function(el, e){
me.close(me.closeAction);
}, me, { delegate: '.x-mask' });
}
});
Ответ 2
Вы можете прослушивать все события кликов, а затем проверить, находится ли позиция щелчка вне окна
Ext.define('myWindow', {
extend: 'Ext.Container',
alias: 'widget.myWindow',
floating: true,
modal: true,
initComponent: function () {
this.initEvents();
this.callParent();
},
initEvents: function () {
//make sure your window is rendered and have sizes and position
if(!this.rendered) {
this.on('afterrender', this.initEvents, this, {single: true});
return;
}
this.mon(Ext.getBody(), 'click', this._checkCloseClick, this);
}
_checkCloseClick: function (event) {
var cx = event.getX(), cy = event.getY(),
box = this.getBox();
if (cx < box.x || cx > box.x + box.width || cy < box.y || cy > box.y + box.height) {
//clean up listener listener
this.mun(Ext.getBody(), 'click', this._checkCloseClick, this);
this.close();
}
}
}
Ответ 3
Вы также можете попробовать:
Ext.getBody().on('click', function(e, t){
var el = win.getEl();
if (!(el.dom === t || el.contains(t))) {
win.close();
}
});
Ответ 4
Я нашел добавление слушателя к телу, и проверка классов css показалась мне немного взломанной. Вы действительно можете переопределить частный метод _onMaskClick
Ext.ZIndexManager
(см. Полностью не hackey). Это позволяет вам добавить свой собственный параметр конфигурации (и даже событие) ко всем окнам.
Ext.define('MyApp.ux.ZIndexManager_maskClick', {
override: 'Ext.ZIndexManager',
_onMaskClick: function ()
{
if (this.front)
{
var allowed = this.front.fireEvent('maskclick', this.front, this.mask);
if (allowed !== false && this.front.closeOnMaskClick)
this.front.close();
}
return this.callParent(arguments);
},
});