Javascript Extjs文档单击事件

Javascript Extjs文档单击事件,javascript,extjs,extjs4,Javascript,Extjs,Extjs4,我有一个popover组件,它在文档单击事件中隐藏其内容。我的逻辑是这样的: show : function () { var me = this; if (me.visible) { return; } Ext.getDoc().on('click', function handleDocClick(e) { if ( e.within(me.el) ) { return; }

我有一个popover组件,它在文档单击事件中隐藏其内容。我的逻辑是这样的:

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;
            .........
},
Ext.getDoc().on('click', Ext.bind(this.handleDocClick, this));
我在调用popover组件隐藏方法时遇到问题。执行此操作时,事件会被释放,从而导致内存泄漏

我尝试按如下方式更改事件绑定:

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;
            .........
},
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().un('click', functionClick);
Ext.getDoc().on('click', functionClick);
在隐藏中:

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

我甚至可以接受全局范围内的函数,但我不确定如何从对象实例分发参数。

我不确定您所说的“展开”是什么意思,但听起来好像您试图执行一次此事件,然后删除侦听器。在这种情况下,ExtJS observable API可以为您的侦听器提供以下选项:

单个:布尔值

如果为True,则添加处理程序以仅处理事件的下一次触发,并且 然后将其自身移除。


希望这就是您所需要的。

这对他来说将无法正常工作,因为在处理程序函数中,它首先需要确定单击发生的位置,如果单击的位置错误,则事件将被忽略,而不是删除侦听器,但每次单击文档中的任何位置时,单个选项都将被删除,哪个用户肯定不想要:)那么为什么不直接将侦听器放在需要隐藏的组件上呢?