在 ExtJs 6.2 中,包含项目的列不考虑其 flex 属性,是否有解决方法?

In ExtJs 6.2, a column that contains an item does not take into account its flex property, is there a workaround?

在 ExtJs 6.2 中,有一个 bug described here in the Sencha Forum

Since 6.2+ Ext.grid.Panel ignores flex when using column items.

Steps to reproduce the problem: Create a grid in fiddle with 6.2+ Add columns without items and flex:1 klick run in fiddle and it looks just fine Add a item to the column with flex:1 klick again run in fiddle an flex wil get ignored!

The result that was expected: I would expect the column to flex.

The result that occurs instead: The column will render in the minimum size.

帖子说这会在夜间构建中得到纠正,但 ExtJs 6.2.1 在 GPL 版本中尚不可用。这个问题有解决方法吗?

或者 id 是否可以让某人发布带有错误修复的覆盖?

编辑:补充见解

查看绑定到列和网格的事件,我可以断言错误发生在 afterrender 事件 (column.flex = 1) 和 afterlayout 事件 (column.flex = null).我不太了解 ExtJs 的布局 运行 细节,因此我对如何进一步缩小可能存在违规代码的位置缺乏想法。如果有人能在这方面给出提示而不是完整的答案,也欢迎他们。

我发现一种解决方法是在网格布局后调整列的大小。这可以正常工作。

唯一的缺点是它对列进行了两次布局。

Ext.define('App.override.grid.Panel', {
    override: 'Ext.grid.Panel',
    initComponent: function() {
        this.callParent(arguments);
        this.on('afterlayout', this.resizeColumns);
    },
    resizeColumns: function () {
        var me = this,
            width = this.getWidth(),
            flex = 0;
        Ext.batchLayouts(function(){
            me.columns.each(function (col) {
                if (col.config.flex) flex += col.config.flex
                else if (col.config.width) width -= col.config.width
                else width -= col.getWidth()
            })
            if (flex) {
                me.columns.each(function (col) {
                    if (col.config.flex) {
                        newWidth = Math.round(width * col.config.flex / flex)
                        if (col.getWidth() != newWidth) col.setWidth(newWidth)
                    }
                })
            }
        })
    }
})

问题:用户无法再调整以这种方式设置宽度的列。

有一个更简单的解决方法(根据 https://fiddle.sencha.com/#view/editor&fiddle/2kgh):

只需在其子项中复制该列的弹性 属性。

    Ext.create('Ext.grid.Panel', {
        title: 'Simpsons',
        store: Ext.data.StoreManager.lookup('simpsonsStore'),
        columns: [
            { text: 'Name', dataIndex: 'name', flex: 1,
                items: [
                    {
                        xtype: 'textfield',
                        flex: 1
                    }
                ]
            },