Не могу заставить TAB изменить редактор на dgrid

Я пытаюсь заставить клавишу TAB перемещаться по моему dGrid. Я использовал в качестве основы решение, найденное в Dgrid установил фокус на ячейку, но там есть пара проблем, с которыми я сталкиваюсь, но пока не могу решить.

Ниже вы можете найти блок, который я сейчас использую; Не у всех столбцов есть редакторы, поэтому я добавил переменную, чтобы определить элемент, чтобы выбрать следующий столбец вместо right. Я также добавил поддержку SHIFT+TAB, чтобы сделать возможной обратную навигацию. MT4.prje.grids[gridId]является экземпляром dGrid. На странице могут быть разные.

Сетка создается с

MT4.prje.grids[gridId] = new (declare([OnDemandGrid, Keyboard, Selection, CellSelection]))(gridInfo, gridId);

где gridInfo содержит определения столбцов и хранилище. Магазин создается как:

new Observable(new Memory({'data': {}, 'idProperty': 'id'}));

Редакторы обычно представляют собой виджеты TextBox, NumberTextBox и Select dijit, все настроены на автосохранение.

aspect.after(MT4.prje.grids[gridId], "edit", function (promise, cellNode) {
    if (promise === null) return;

    promise.then(function (widget) {
        if (!widget._editorKeypressHandle) {
            widget._editorKeypressHandle = on(widget, "keypress", function (e) {

                for (var rowId in MT4.prje.grids[gridId].selection) {
                    break;
                }
                for (var columnId in MT4.prje.grids[gridId].selection[rowId]) {
                    break;
                }

                if (e.charOrCode == keys.TAB) {
                    e.preventDefault();

                    var cellToEdit = null,
                        cellEdited = MT4.prje.grids[gridId].cell(rowId, columnId);

                    if (e.shiftKey) {
                        if (cellEdited.column.previousEditor === undefined) {
                            rowId = parseInt(rowId) - 1;
                            if (MT4.prje.grids[gridId].row(rowId).element !== null) {
                                for (var lastColumnId in MT4.prje.grids[gridId].columns) {}
                                cellToEdit = MT4.prje.grids[gridId].cell(rowId, lastColumnId);
                            }
                        } else {
                            cellToEdit = MT4.prje.grids[gridId].cell(rowId, cellEdited.column.previousEditor);
                        }
                    } else {
                        if (cellEdited.column.nextEditor === undefined) {
                            var firstColumnId = null;
                            rowId = parseInt(rowId) + 1;
                            if (MT4.prje.grids[gridId].row(rowId).element === null) {
                                var fields = {};
                                for (var cId in MT4.prje.grids[gridId].columns) {
                                    if ((cId != 'excluir') && (firstColumnId === null)) {
                                        firstColumnId = cId;
                                    }
                                    fields[cId] = '';
                                }
                                MT4.prje.addRowToGrid(gridId, fields);
                            } else {
                                for (var cId in MT4.prje.grids[gridId].columns) {
                                    if (cId != 'excluir') {
                                        firstColumnId = cId;
                                        break;
                                    }
                                }
                            }

                            cellToEdit = MT4.prje.grids[gridId].cell(rowId, firstColumnId);
                        } else {
                            cellToEdit = MT4.prje.grids[gridId].cell(rowId, cellEdited.column.nextEditor);
                        }
                    }

                    if (cellToEdit) {
                        MT4.prje.grids[gridId].deselect(cellEdited);
                        MT4.prje.grids[gridId].select(cellToEdit);
                        MT4.prje.grids[gridId].edit(cellToEdit);

                    }
                }
            });
        }
    });
});

Даже игнорируя новую часть строки, происходит несколько ошибок. Во-первых, редактор едва появляется и исчезает вместе с выделением. Иногда при табуляции в пустой столбец редактор будет заполнен значениями предыдущего редактора. Есть ли способ сделать это более последовательно?

Я предполагаю, что в sharedEditor происходит состояние гонки (для них установлено значение editOn: focus). Я попытался обернуть отмену выбора/выбора в dojo.on('blur') и испустить его. Но это не всегда правильно с виджетами dijit/form/Select. Есть ли лучшее событие, которое я могу призвать для этого?

Я также попытался изменить последний блок на:

if (cellToEdit) {
    on(cellToEdit.element, 'focus', function(){
        MT4.prje.grids[gridId].select(cellToEdit);
    });

    on(cellEdited.element, 'blur', function(){
        MT4.prje.grids[gridId].deselect(cellEdited);
        on.emit(cellToEdit.element, 'focus', {'bubble': true, 'cancelable': false});
    });

    on.emit(cellEdited.element, 'blur', {'bubble': true, 'cancelable': false});
}

Но это дает две ошибки:

  1. Если я внесу изменения в ячейку, она не перейдет к следующему редактору. Даже не выбирает.
  2. В первый раз, когда я перехожу из пустой ячейки в другую пустую ячейку, это тоже не работает.

У кого-нибудь есть идеи?


person Yohan Leafheart    schedule 18.10.2013    source источник
comment
Спасибо за правку кода   -  person Yohan Leafheart    schedule 18.10.2013
comment
Автосохранение не очень хорошо работает с вкладками на dgrid, в данный момент вы можете попробовать версию для разработчиков, потому что недавно были объединены некоторые исправления для устранения некоторых из этих проблем. github.com/SitePen/dgrid/pull/632. Если это не сработает, я поделюсь тем, что придумал.   -  person Richard Ayotte    schedule 22.10.2013
comment
К., завтра можно будет попробовать. Я опубликую, что произошло.   -  person Yohan Leafheart    schedule 23.10.2013
comment
Нет, пока не работает. Вот что происходит. Он случайным образом не запускает выбор в следующем редакторе списка. Он начинает редактировать следующую ячейку, но ячейка не выбрана, поэтому я не могу перейти оттуда.   -  person Yohan Leafheart    schedule 26.10.2013


Ответы (1)


Это исправление работает на dgrid 0.3.11.

Добавьте в свой dgrid postCreate.

postCreate: function() {
    var that = this;
    this.inherited(arguments);

    this.on('dgrid-datachange', function(evt) {
        that._selectedCell = that.cell(evt);
    });

    aspect.after(this, 'save', function(dfd) {
        dfd.then(function() {
            var nextCell = that.right(that.cell(that._selectedCell.row.id, that._selectedCell.column.id));
            that.edit(nextCell);
            // Bonus Fix. Workaround dgrid bug that blocks field text to be selected on focus.
            nextCell.element.widget && nextCell.element.widget.textbox && nextCell.element.widget.textbox.select();
        });
    });
}
person Richard Ayotte    schedule 26.10.2013