【问题标题】:ExtJS 7 - Column filter issue with locked columnExtJS 7 - 锁定列的列过滤器问题
【发布时间】:2020-08-19 13:00:33
【问题描述】:

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

这是小提琴:sencha fillde

重现步骤: (不要应用任何过滤器)

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

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

【问题讨论】:

  • 您是否已将此情况报告给 Sencha 支持?这绝对是一个错误,感觉像是某种参考问题。 Ext.grid.filters.Filters:onMenuBeforeShow 应该在每次单击菜单时触发,但是当您首先显示其中一个菜单时似乎并非总是如此。

标签: extjs filter extjs7


【解决方案1】:

好的,这个有点棘手。事实证明,对于锁定的网格,Ext.grid.filters.Filters:onMenuCreate 被击中两次……显示的网格菜单的每一侧都有一个。问题是在onMenuCreate 中,框架没有考虑到这两个菜单。它只关心创建的最后一个菜单并销毁前一个菜单的侦听器。在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();
    }
});

【讨论】:

  • 感谢您的详细解释,覆盖对我有用!我无法获得 sencha 支持,如果您不介意,请提交此缺陷的票。
  • 我为此创建了一个 Sencha 支持线程,显然一个错误已作为 EXTJS-28785 登录到他们的系统中。
猜你喜欢
  • 1970-01-01
  • 2016-05-26
  • 2012-06-26
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2014-11-13
相关资源
最近更新 更多