2012-03-22 102 views
0

我有一個彈出窗口組件,它隱藏文檔點擊事件的內容。我的邏輯是這樣的:Extjs文檔點擊事件

show : function() { 
    var me = this; 

    if (me.visible) { 
     return; 
    } 


    Ext.getDoc().on('click', function handleDocClick(e) { 

     if (e.within(me.el)) { 
      return; 
     } 

     if (me.isVisible() && !e.within(me.divEl)) { 
      me.hide(); 
      Ext.getDoc().un('click', handleDocClick); 
     } 
    }); 

    var cfg = me.determineLocation();  
    me.setLocation(cfg); 

    me.visible = true; 
}, 

hide : function() { 
    this.visible = false; 
      ......... 
}, 

我有調用popover組件隱藏方法的問題。這樣做會使事件無法有效地導致內存泄漏。

我試圖改變的情況下這樣的結合:

Ext.getDoc().on('click', Ext.bind(this.handleDocClick, this)); 

和隱藏:

hide : function() { 
    Ext.getDoc().un('click', Ext.bind(this.handleDocClick, this)); 
    this.visible = false; 
      ......... 
}, 

但這並沒有多大幫助的情況下無法正常再放鬆。

我的問題是如何解決這個問題。最好的解決辦法是:在 顯示:

Ext.getDoc().un('click', functionClick); 
Ext.getDoc().on('click', functionClick); 

和隱藏:

Ext.getDoc().un('click', functionClick); 

我可以接受在全球範圍內,甚至一個函數,但我不知道我怎樣才能從對象分發PARAMS實例。

回答

0

我不清楚你放鬆的意思,但它聽起來像你試圖讓這個事件被執行一次,然後偵聽器被刪除。在這種情況下觀察到的ExtJS API有選擇,包括你的聽衆:

單:布爾

真正增加一個處理程序來處理只是事件的下一次發射,並 然後刪除自身。 http://docs.sencha.com/ext-js/4-0/#!/api/Ext.util.Observable-method-on

希望這就是你需要的。

+0

這對他來說將無法正常工作,因爲在處理函數中,首先需要確定點擊發生的位置,如果它在錯誤位置點擊,則忽略該事件而不是移除該偵聽器,但每次發生點擊時都會刪除單個選項文檔中的任何地方,哪個用戶絕對不想:) – 2012-03-22 18:20:28

+0

那麼爲什麼不直接將偵聽器放在需要隱藏的組件上呢? – dbrin 2012-03-23 02:22:23