3

偶尔我会从我的 Ext Js 4.2.1 无限滚动网格中得到异常“PageMap 询问它没有的范围”。它在第 211 行的 data/PageMap.js 中提出。当然不应该要求不存在的条目,但这有时是由框架本身完成的。似乎以某种方式连接到添加/删除记录或重新加载网格。Sencha 论坛中已经有一些关于此主题的主题,例如this,但尚未提出杀手级解决方案或错误修复。

同时,我必须不让用户看到这个异常。这样做的好方法是什么?棘手的是,它有时只是由用户移动滚动条引起的,所以我的代码中没有一行直接涉及。

4

3 回答 3

4

我发现根本原因是当它渲染行时,它会确定它是否在选定行之前。如果它在最后一行工作,它仍然会查找第 + 1 行。(Ext.view.Table:931 in 4.2.1)

我的简单解决方案是让它返回 false:

Ext.override(Ext.selection.RowModel,
{
    isRowSelected: function (record, index)
    {
        try
        {
            return this.isSelected(record);
        }
        catch (e)
        {
            return false;
        }
    }
});
于 2013-08-16T19:37:14.583 回答
2

克里斯托夫,

在异步刷新网格期间,我遇到了类似的“PageMap 要求提供它没有的范围”的问题。我在 ExtJS 4.2.1 代码中发现了一些错误来源,并创建了对我有用的简单覆盖。你可以试试它是否适合你。我会很高兴收到您的反馈。

Ext.override(Ext.view.Table, {
    getRecord: function (node) {
        node = this.getNode(node);
        if (node) {
            var recordIndex = node.getAttribute('data-recordIndex');
            if (recordIndex) {
                recordIndex = parseInt(recordIndex, 10);
                if (recordIndex > -1) {
                    // Eliminates one of sources of "PageMap asked for range which it does not have" error
                    if (this.store.getCount() > 0) {
                        return this.store.data.getAt(recordIndex); 
                    }
                }
            }
            return this.dataSource.data.get(node.getAttribute('data-recordId'));
        }
    },
    renderRow: function (record, rowIdx, out) {
        var me = this,
        isMetadataRecord = rowIdx === -1,
        selModel = me.selModel,
        rowValues = me.rowValues,
        itemClasses = rowValues.itemClasses,
        rowClasses = rowValues.rowClasses,
        cls,
        rowTpl = me.rowTpl;
        rowValues.record = record;
        rowValues.recordId = record.internalId;
        rowValues.recordIndex = rowIdx;
        rowValues.rowId = me.getRowId(record);
        rowValues.itemCls = rowValues.rowCls = '';
        if (!rowValues.columns) {
            rowValues.columns = me.ownerCt.columnManager.getColumns();
        }
        itemClasses.length = rowClasses.length = 0;
        if (!isMetadataRecord) {
            itemClasses[0] = Ext.baseCSSPrefix + "grid-row";
            if (selModel && selModel.isRowSelected) {
                var storeRows = this.getStore().getCount();
                // Eliminates one of sources of "PageMap asked for range which it does not have" error
                if (rowIdx + 1 < storeRows) { 
                    if (selModel.isRowSelected(rowIdx + 1)) {
                        itemClasses.push(me.beforeSelectedItemCls);
                    }
                }
                if (selModel.isRowSelected(record)) {
                    itemClasses.push(me.selectedItemCls);
                }
            }
            if (me.stripeRows && rowIdx % 2 !== 0) {
                rowClasses.push(me.altRowCls);
            }
            if (me.getRowClass) {
                cls = me.getRowClass(record, rowIdx, null, me.dataSource);
                if (cls) {
                    rowClasses.push(cls);
                }
            }
        }
        if (out) {
            rowTpl.applyOut(rowValues, out);
        } else {
            return rowTpl.apply(rowValues);
        }
    }
});
于 2013-07-30T09:04:31.960 回答
0

所有这些代码都对我不起作用,经过多次调试后,我编写了这个覆盖来解决问题。



Ext.define('overrides.LruCache', {

    override: 'Ext.util.LruCache',

    // private. Only used by internal methods.
    unlinkEntry: function (entry) {
        // Stitch the list back up.
        if (entry) {
            if (this.last && this.last.key == entry.key)
                this.last = entry.prev;
            if (this.first && this.first.key == entry.key)
                this.first = entry.next;

            if (entry.next) {
                entry.next.prev = entry.prev;
            } else {
                this.last = entry.prev;
            }
            if (entry.prev) {
                entry.prev.next = entry.next;
            } else {
                this.first = entry.next;
            }
            entry.prev = entry.next = null;
        }
    }


});
于 2014-04-28T17:47:58.167 回答