Буферизованный рендерер с включенной блокировкой не работает должным образом EXT Js

#javascript #extjs

#javascript #extjs

Вопрос:

Я использую сетку с большим количеством записей. Но когда я использую буферизованный рендеринг с включенной блокировкой, он не печатает все записи. Вот скрипка для вышеупомянутого. https://fiddle.sencha.com/#fiddle/39sdamp;view/editor Если вы прокомментируете ‘enableLocking: true’, он напечатает все записи, в противном случае он показывает ограниченные записи. Я хочу использовать как блокировку, так и буферизацию вместе. Как я могу это сделать?

Комментарии:

1. Я вижу одинаковое количество записей в любом случае. 108 записей.

2. Вы также должны прокомментировать locked:true из первого столбца. Он покажет вам все записи.

Ответ №1:

Проблема в том, что функция инициализации из Ext.grid.plugin.BufferedRenderer зависит от представления.lockingPartner, который не определен при вызове init.

Это переопределение устраняет проблему

     Ext.define('BufferedRendererInit', {
    override: 'Ext.grid.plugin.BufferedRenderer',
    
    // Initialize this as a plugin
    init: function(grid) {
        var me = this,
            view = grid.view,
            viewListeners = {
                beforerefresh: me.onViewBeforeRefresh,
                refresh: me.onViewRefresh,
                columnschanged: me.checkVariableRowHeight,
                scope: me,
                destroyable: true
            },
            scrollerListeners = {
                scroll: me.onViewScroll,
                scope: me
            },
            initialConfig = view.initialConfig;
        
        //start override
        //original code: view.lockingPartner is undefined.
        //me.scroller = view.lockingPartner ? view.ownerGrid.scrollable : view.getScrollable();
        var isLockingOwnerGrid = view.ownerGrid amp;amp; view.ownerGrid.lockedGridConfig amp;amp; view.ownerGrid.normalGridConfig;
        me.scroller = isLockingOwnerGrid ? view.ownerGrid.scrollable : view.getScrollable();
        //end override
        
        // If we are going to be handling a NodeStore then it's driven by node addition and removal,
        // *not* refreshing. The view overrides required above change the view's onAdd and onRemove
        // behaviour to call onDataRefresh when necessary.
        if (grid.isTree || (grid.ownerLockable amp;amp; grid.ownerLockable.isTree)) {
            view.blockRefresh = false;
            // Set a load mask if undefined in the view config.
            if (initialConfig amp;amp; initialConfig.loadMask === undefined) {
                view.loadMask = true;
            }
        }
        if (view.positionBody) {
            viewListeners.refresh = me.onViewRefresh;
        }
        me.grid = grid;
        me.view = view;
        me.isRTL = view.getInherited().rtl;
        view.bufferedRenderer = me;
        view.preserveScrollOnRefresh = true;
        view.animate = false;
        // It doesn't matter if it's a FeatureStore or a DataStore.
        // The important thing is to only bind the same Type of store in future operations!
        me.bindStore(view.dataSource);
        // Use a configured rowHeight in the view
        if (view.hasOwnProperty('rowHeight')) {
            me.rowHeight = view.rowHeight;
        }
        me.position = 0;
        me.viewListeners = view.on(viewListeners);
        // Listen to the correct scroller. Either the view's one, or of it is
        // in a lockable assembly, the y scroller which scrolls them both.
        // If the view is not scrollable, this will be falsy.
        if (me.scroller) {
            me.scrollListeners = me.scroller.on(scrollerListeners);
        }
    }
});