无限网格不再适用于ExtJS 7.3.1现代版



被迫升级7.2现代版->7.3.1由于Open Tooling在节点15.x中损坏(自制程序在我的mac上应用的更新(。不,我发现使用虚拟存储的网格不再适用于在第一页上选择任何内容!请参阅Sencha自己的厨房水槽,其中第一页没有在第一页上显示亮点,但如果向下滚动,则可以选择行:https://examples.sencha.com/extjs/7.3.0/examples/kitchensink/?modern#infinite-栅格有人知道附近有工作吗?

EDIT:如果你有网格过滤器插件,我发现第一个页面加载被中止,并发出重新加载。重载没有在virtualPage上运行onLoad方法。这导致数据被加载,但indexMap没有被更新。我做了一个重写来调用这个方法。这还没有经过很好的测试。。。超出了我的简单测试用例。

如果你正在使用Ext.Direct填充虚拟商店,并且你滚动到很快,系统就会绊倒并锁定。我也有一个覆盖,我会把它添加到这张票的底部。

    Ext.define('Xxx.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);
                
                if (me.pageMap.getPageCount() !== 0 && pageNumber) {
                    page = me.pageMap.getPage(pageNumber - 1, false);
                    if (page && !(page.error = op.getError())) {
                        
                        
                        page.records = op.getRecords();
                        page.state = 'loaded';
                    }
                }
                page.onLoad(op);  // ONLY CHANGE TO ORIGINAL METHOD
                me.fireEvent('reload', me, op);
                for (i = 0; i < len; ++i) {
                    range = activeRanges[i];
                    if (pageMap.canSatisfy(range)) {
                        range.reload();
                    }
                }
            }
            if (resultSet) {
                rsRecords = resultSet.records;
            }
            me.fireEvent('load', me, rsRecords, wasSuccessful, op);
        }
    }
});

使用虚拟存储时的Ext.Direct覆盖。

    Ext.define('Xxx.override.data.proxy.Direct', {
    override: 'Ext.data.proxy.Direct',
    
    abort: function(operation) {
        let returnValue = this.callParent(arguments);
            if (operation && operation.isDataRequest) {
                    operation = operation.getOperation();
            }
        
        // This is the part added by mcg1103.  when using a virtual store
        // when an operation is aborted it is never completed and the Page
        // object is left behind in the loading array among other places.
        // firing the callbacks will gracefully remove all remnants.
        if (operation && Ext.isFunction(operation.triggerCallbacks)) {
            operation.triggerCallbacks();
        }
        
        return returnValue;
        }
});

编辑:仍然没有解决方案,但如果你评论出

plugins: {
    gridfilters: false
},

问题消失了。这是因为在调用加载第一个页面的操作之后,会触发重新加载筛选器事件。这将导致中止加载第一页。应该重新加载页面,但似乎没有。数据在那里,页面数据被加载,但indexMap没有设置值。因此,当加载中止时,页面的属性不会被删除,因此它将被重新加载。我仍在寻找解决方案。

7.3.0中也对此进行了说明。我已经将其缩小到第一页没有正确设置对象的位置。位置有几个问题——我看到的主要问题是recordIndex设置不正确,它仍然是默认值-1。而且这个记录还没有被打破。当然,这只是无限存储中记录的第一页。位置对象也缺少其他数据。看起来好像还没准备好。正在调用childtap事件,但位置当然是错误的。我正在研究为什么位置不正确。。。。如果我弄清楚了,我会汇报的。

edit:系统找不到InternalId的记录,因为indexMap没有第一页的记录。onPageLoad事件未开始为第一页调用。还在看。

最新更新