Я пытаюсь заставить клавишу 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});
}
Но это дает две ошибки:
- Если я внесу изменения в ячейку, она не перейдет к следующему редактору. Даже не выбирает.
- В первый раз, когда я перехожу из пустой ячейки в другую пустую ячейку, это тоже не работает.
У кого-нибудь есть идеи?