как прокрутить сеточную панель ToDeltaX в активный редактор (cellediting)? - PullRequest
0 голосов
/ 18 октября 2011

у меня есть сеточная панель с плагином для cellediting и большим количеством заголовков сетки
(хотя бы сделайте так, чтобы сетка показала горизонтальную полосу прокрутки) ...
вот это ДЕМО ...

есть ошибка в моей сетке, попробуйте отредактировать один из столбцов, а затем нажмите клавишу табуляции, чтобы перейти к header15 .. сетка не прокручивалась туда, где я редактирую, ...
это ошибка ?? Я искал это на их форуме , но не повезло ..

итак, как это исправить ??
как заставить мою сетку прокручиваться до активного редактора ??

из документов, есть метод scrollByDeltaX,
а как узнать дельту из активного редактора ??

1 Ответ

0 голосов
/ 22 октября 2011

Короче, Сначала попробуйте демо :)

(Слишком бесплатно, и вы хотели получить награду, пожалуйста, наградите меня!)

Забавно, что мой ответ работает простохорошо на 4.0.7, но не работает на 4.0.2a!Не зная, я проверил источник 4.0.2a и шокирующе увидел это:

In src/panel/Table.js (4.0.2a)

/**
 * Scrolls the TablePanel by deltaY
 * @param {Number} deltaY
 */
scrollByDeltaY: function(deltaY) {
    var verticalScroller = this.getVerticalScroller();

    if (verticalScroller) {
        verticalScroller.scrollByDeltaY(deltaY);
    }
},

/**
 * Scrolls the TablePanel by deltaX
 * @param {Number} deltaY
 */
scrollByDeltaX: function(deltaX) {
    var horizontalScroller = this.getVerticalScroller();

    if (horizontalScroller) {
        horizontalScroller.scrollByDeltaX(deltaX);
    }
},

Заметили что-нибудь?Оформить заказ на функцию scrollByDeltaX!Это неправильно написано (исправлено в 4.0.7) !!!И это, очевидно, не будет иметь никакой визуальной обратной связи.Это просит вертикальную полосу прокрутки сделать прокрутку deltaX.Как это может быть?

В любом случае, решить эту проблему довольно легко, если вы не хотите обновляться до 4.0.7. В Afaik 4.0.7 есть множество ошибок, унаследованных от 4.0.6, и это ломает мой проект с этой чертовой проблемой маскировки.

Ниже приведен мой рабочий ответ, и я надеюсь, что вы оценитеЭто.По сути, я изменил метод onEditorTab и создал обработчик событий, чтобы ваш grid мог подключиться к нему и выполнить scrollByDeltaX при срабатывании табуляции.

Я не слишком уверен, каксделайте прокрутку влево / вправо, так что в моем коде из лени использовался забавный Infinity.

Вот пример: DEMO (Не забудьте попробовать SHIFT + TAB тоже)

/**
 * Customized Row Selection Model which will
 * fires "editortab" event when an tabbing occurs
 */
Ext.define('NS.RowModel', {
    extend: 'Ext.selection.RowModel',

    //False to wrap to next row when you tab
    //to the end of a row
    preventWrap: false,

    initComponent: function() {
        /**
         * @event editortab
         * Fires when editor is tabbed
         * @param {RowModel} rowModel this rowmodel
         * @param {Editor} edt The editor
         * @param {string} dir The direction of the tab (left or right)
         * @param {Event} e The event object
         */
        this.addEvents('editortab');
        this.callParent();
    },

    //memorizing which is the last context
    lastEditorContext: null,

    onEditorTab: function(edt, e) {

        //Part of this code is from the original onEditorTab in
        //src/selection/RowModel.js line 416
        var me = this,
            view = me.views[0],
            record = edt.getActiveRecord(),
            header = edt.getActiveColumn(),
            position = view.getPosition(record, header),
            direction = e.shiftKey ? 'left' : 'right',
            newPosition  = view.walkCells(position, direction, e, this.preventWrap);

        //we store the last context, so we know whether the 
        //context has changed or not
        me.lastEditorContext = edt.context;

        //if there is new position, edit; else, complete the edit.
        if (newPosition) {
            edt.startEditByPosition(newPosition);
        }else{
            edt.completeEdit();
        }

        //If context doesn't change, we try to walk
        //to the next one until we find a new edit box (context changed)
        while (me.lastEditorContext === edt.context && newPosition) {
            newPosition = view.walkCells(newPosition, direction, e, this.preventWrap);
            if (newPosition) {
                edt.startEditByPosition(newPosition);
            }
        }

        //Fires the event
        this.fireEvent('editortab', this, edt, direction, e);
    }
});

/**
 * Customized Editor Grid to support tabbing
 */
Ext.define('NS.EditorGrid', {
    extend: 'Ext.grid.Panel',
    initComponent: function() {
        var me = this;

        Ext.applyIf(me, {
            plugins: [Ext.create('Ext.grid.plugin.CellEditing', {
                clicksToEdit: 1
            })],

            selModel: Ext.create('NS.RowModel', {
                listeners: {
                    editortab: {
                        fn: me.onEditorTab,
                        scope: me
                    }
                }
            })
        });

        me.callParent();
    },

    onEditorTab: function(sel, edt, dir, e) {

        var lastRow = sel.lastEditorContext.rowIdx,
            newRow = edt.context.rowIdx,
            deltaX = 0;

        //Let's calculate deltaX first

        //if row changed, we reset the cells to the left most or right most
        if (lastRow != newRow) {
            deltaX = lastRow < newRow ? -Infinity : Infinity;
        }else{
            //else, do deltax :)
            deltaX = edt.context.column.width * (dir == 'right' ? 1 : -1);
        }


        //If you are using 4.0.2a, use this. They have typo in
        //src/panel/Table.js, line 1133
        var horizontalScroller = this.getHorizontalScroller();
        if (horizontalScroller) horizontalScroller.scrollByDeltaX(deltaX);


        //But if you are running 4.0.7, this is fine. Use this:
        //this.scrollByDeltaX(deltaX);
    }
});

//-------------------------------------------------
//Everything below remains :)

Ext.onReady(function() {

    var storeSr=Ext.create('Ext.data.ArrayStore', {
        fields: ["KD_SR","NM_SR"]
    });

    //load data
    var tmpd=[];
    for (i=1;i<=15;i++){
        tmpd.push([i,"nm "+i]);
    }
    storeSr.loadData(tmpd);

    //create column
    col=[]
    col.push({header: "Kode", dataIndex: 'KD_SR'});
    for (j=1;j<=15;j++){
        col.push({
            header: "Header"+j,
            width:100,
            dataIndex: 'NM_SR',
            editor:{xtype:"textfield"}
        });
    }

    var gridSr = Ext.create('NS.EditorGrid', {
        height: 200,
        width: 500,
        store: storeSr,
        columns: col
    });

    //create window
    var winEditSR=Ext.create("Ext.Window",{
        title:"Sub Rayon",
        autoWidth : true,
        autoHeight : true,
        autoShow:true,
        border : false,
        modal : true,
        items : [gridSr]
    }); 
});

Я все еще задаюсь вопросом, может ли быть лучшее решение ... возможно, с помощью столбца (header) x для определения скроллера scrollLeft, но это будет довольно вяло ...

...