ExtJS 7-锁定列的列过滤器问题

问题描述

我遇到了这个错误,如果网格具有锁定的列,则列过滤器不正确

这是小提琴:sencha fillde

复制步骤: (请勿应用任何过滤器)

  1. 打开“电子邮件”列菜单
  2. 打开“名称”列菜单(这是锁定列)
  3. 打开“电话”列菜单(请注意,过滤器菜单不正确,它正在显示“电子邮件”列的过滤器。)

对于没有“锁定”列的网格,过滤器菜单可以正常工作,感谢任何能提供帮助的人!

解决方法

好的,这有点棘手。事实证明,对于锁定的网格,Ext.grid.filters.Filters:onMenuCreate会被击中两次……在所显示的网格菜单的每一侧都被击中一次。问题在于,在onMenuCreat e中,框架没有考虑这两个菜单。它只关心创建的最后一个菜单并销毁上一个菜单的侦听器。在onMenuBeforeShow中,该框架确实考虑了网格的每一面,因此我将此想法扩展为覆盖。我鼓励您为此创建一张Sencha支持票,如果您没有访问权限,请告诉我,以便我提交。 Fiddle here

Ext.override(Ext.grid.filters.Filters,{
    onMenuCreate: function (headerCt,menu) {
        var me = this;

        // TODO: OLD BAD CODE... this would destroy the first menu's listeners
        // if (me.headerMenuListeners) {
        //     Ext.destroy(me.headerMenuListeners);
        //     me.headerMenuListeners = null;
        // }

        // me.headerMenuListeners = menu.on({
        //     beforeshow: me.onMenuBeforeShow,//     destroyable: true,//     scope: me
        // });

        // Just like in the onMenuBeforeShow,we need to create a hash of our menus
        // and their listeners... if we don't,we remove the 1st menu's listeners
        // when the 2nd menu is created
        if (!me.headerMenuListeners) {
            me.headerMenuListeners = {};
        }

        var parentTableId = headerCt.ownerCt.id;
        var menuListener = me.headerMenuListeners[parentTableId];
        if (menuListener) {
            Ext.destroy(menuListener);
            me.headerMenuListeners[parentTableId] = null;
        }

        me.headerMenuListeners[parentTableId] = menu.on({
            beforeshow: me.onMenuBeforeShow,destroyable: true,scope: me
        });
    },destroy: function () {
        var me = this,filterMenuItem = me.filterMenuItem,item;

        // TODO: ADDING THIS AND REMOVING FROM THE Ext.destroy on the next line
        var headerMenuListeners = this.headerMenuListeners;
        Ext.destroy(me.headerCtListeners,me.gridListeners);

        me.bindStore(null);
        me.sep = Ext.destroy(me.sep);

        for (item in filterMenuItem) {
            filterMenuItem[item].destroy();
        }

        // TODO: ADDING THIS AND REMOVING FROM THE Ext.destroy on the next line
        for (item in headerMenuListeners) {
            headerMenuListeners[item].destroy();
        }

        this.callParent();
    }
});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...