extjs 在调整大小之前为空网格单元格

xe55xuns  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(134)

我使用的是ExtJS 7.3.1,我有一个网格绑定到一个带有REST代理的虚拟商店。单元格值Map到加载到商店中的模型的属性。这里没有什么特别的。
我发现当我加载视图时,它从API中提取数据,并按预期向网格中添加行,但单元格是空的。但是,当我调整窗口大小和网格大小时,单元格会被正确填充。
在调整大小之前查看浏览器的devtools,我看到单元格如下所示,其中x-body-el的内容是 ,而不是模型属性的值。

<div data-componentid="ext-gridcell-10" class="x-gridcell x-widthed x-align-left" data-xid="101" id="ext-gridcell-10" tabindex="-1" style="width: 473.688px;">
  <div data-qoverflow="true" class="x-body-el x-gridcell-body-el" id="ext-element-326">
    &nbsp;
  </div>
</div>

调整大小后,&nbsp;将替换为模型中的正确值。
很奇怪。也许是虫子?

syqv5f0l

syqv5f0l1#

在ExtJS 7.3中,很不幸的是添加了一些关于虚拟商店的bug。我也为这样的问题创建了一个ticket,这是由于执行reload引起的。这里不仅单元格是空的,选择模型也被破坏了。
我为此创造了一个小提琴(可能是同一个问题):https://fiddle.sencha.com/#fiddle/3c0u
如果点击“加载”,一切正常。如果点击“加载并重新加载”,则会得到空单元格。点击“重新加载”也是如此
提示:您必须重新执行应用程序,才能看到问题。如果一开始发生载入,它会运作,而且您无法重现问题。
我们通过添加以下覆盖来解决此临时问题:

Ext.define('X.override.data.virtual.Store', {
    override: 'Ext.data.virtual.Store',

    privates: {
        handleReload: function (op) {
            var me = this,
                activeRanges = me.activeRanges,
                len = activeRanges.length,
                pageMap = me.pageMap,
                resultSet = op.getResultSet(),
                wasSuccessful = op.wasSuccessful(),
                pageNumber = op.config && op.config.page,
                rsRecords = [],
                i, range, page;

            if (wasSuccessful) {
                me.readTotalCount(resultSet);

                // Condition for a valid page
                if (me.pageMap.getPageCount() !== 0 && pageNumber) {
                    page = me.pageMap.getPage(pageNumber - 1, false);

                    if (page && !(page.error = op.getError())) {
                        // Filling the page with records loaded from the operation
                        // and marking the page as loaded
                        page.records = op.getRecords();
                        page.state = 'loaded';
                    }
                }

                me.fireEvent('reload', me, op);

                for (i = 0; i < len; ++i) {
                    range = activeRanges[i];

                    if (pageMap.canSatisfy(range)) {
                         range.reload();
                    }
                }
                // override start

                // This fixes the problem, that first page entries are displayed as empty rows
                // and the selection model not working after reload.
                // With this override, the page will be handled like in a load.
                // This is only called for the active page, since the others are loaded normally over load.
                // Has to be placed after range.reload(). Otherwise the selection will break (only works if both exist).
                // Issue EXTJS-29428
                if (pageMap && page) {
                    pageMap.onPageLoad(page);
                }
                // override end
            }

            if (resultSet) {
                rsRecords = resultSet.records;
            }

            me.fireEvent('load', me, rsRecords, wasSuccessful, op);
        }
    }
});

相关问题