2012-09-14 15 views
12

Ben kalıcı bir pencere oluşturursanız:Maske tıklatıldığında kalıcı pencere uzantıları nasıl kapatılır?

Ext.define('myWindow', { 
    extend: 'Ext.Container', 
    alias: 'widget.myWindow', 
    floating: true, 
    modal: true, 
    listeners: 
     'onMaskClick???': { close the window } 
    ..... 
} 

kullanıcı penceresinin dışında maske tıkladığında nasıl anlarım? Sench Touch'da, belirtmeme izin veren bir config hide HideMacKap var. ExtJS için olay/yapılandırma nedir?

+0

A loadmask tıklama yayına sahip değil. –

cevap

16

tramvay davası dışındaysa edip etmediğini kontrol, tüm tıklama olaylarını dinleyebilirsiniz (çeşit) modal veya olmayan modal pencereler üzerinde çalışır. Ancak, bir combobox'ın sınır listesi gibi alt bileşenlerin, windows sınırları dışına çıkması söz konusu değildir.

Yine de kalıcı pencereleri kullanıyorsanız yine de maske üzerindeki bir tıklama olayını dinleyebilirsiniz.

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' }); 
    } 
}); 
+1

Doğru cevap budur ve bir temsilci kullanmak çok zekice. Pencerenin her zaman modal olması gerekir, aksi halde kullanıcı başka bir pencereyle etkileşime geçtiğinde kapanması garip olur. Modal pencerelerin bunu kullanıcıya önermek için görsel bir işareti vardır. – jjrv

+1

, 'initComponent' işlevinin ilk satırı olmamalıdır 'var me = this; '? – Geo

+0

haklısın, kopyala yapıştır kodunu karıştırdım :) – VDP

11

Tıklama pozisyon penceresinin

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(); 
     } 
    } 
} 
+0

teşekkürler! harika çalışıyor. – johnstoecker

+3

Pencerenizde bir açılan kutunuz varsa, açılan liste pencereler sınırlarının dışında oluşturulabilir. Pencerelerin sınırları dışında bir öğe seçtiğinizde pencerenin istenmeyen kapanmasına neden olur. Bazı değişikliklerden sonra – VDP

+0

benim için mükemmel çalıştı. teşekkür ederim. –

1

Ayrıca bu deneyebilirsiniz:

Ext.getBody().on('click', function(e, t){ 
    var el = win.getEl(); 

    if (!(el.dom === t || el.contains(t))) { 
     win.close(); 
    } 
}); 
+1

Bu fikri beğeniyorum! Benim durumumda pencere kullanıyorum ama kenarlıksız vb. Bu yüzden gizlenmiş olması gerektiğinde gizlememe yardımcı olabilir :) – Andron

+0

Yakalanmamış ReferenceError: win tanımlı değil – Geo

0

ben beden için bir dinleyici ekleme ve css sınıfları bana biraz hackey hissetti kontrol bulundu. Gerçekte özel yöntemini _onMaskClick geçersiz kılabilirsiniz (bkz, tamamen hacker değil). Hangi tüm pencereler için kendi yapılandırma parametresi (ve hatta olay) eklemenizi sağlar.

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); 
    }, 
}); 
İlgili konular