2012-03-22 87 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