#tabulator
#табулятор
Вопрос:
Мне нужно знать, когда редактирование строки закончилось (это означает, когда редактор ячеек переместился в другую строку или редактор ячеек был скрыт с любыми изменениями), чтобы отправить отредактированные данные в службу. У меня есть cellEditing
и cellEdited
события, но отправка данных после каждого cellEdited
слишком дорого.
Может быть, я могу использовать, например, cellEdited
с некоторыми дополнительными проверками, но я не могу понять, как это сделать. Или, может быть, есть лучший способ сделать это?
Ответ №1:
Вы можете вызвать компонент isEdited
для ячейки, чтобы узнать, редактировался ли он в прошлом, поэтому при cellEdited
обратном вызове вы можете перебирать ячейки в строке до ses, если все они были отредактированы:
dataEdited:function(cell){
var cells = cell.getRow().getCells();
var allEdited = true;
cells.forEach(function(cell){
if(!cell.isEdited()){
allEdited = false;
}
});
if(allEdited){
//do something when all cells have been edited
}
}
вы также можете снять отредактированный флаг с ячейки, используя функцию ‘clearEdited’ в компоненте cell, это может быть полезно, чтобы позволить пользователю редактировать снова после того, как вы выполнили все, что вам нужно после редактирования строки:
cell.clearEdited();
Комментарии:
1. Большое спасибо за ваш ответ. Я не был точен в формулировке своего вопроса, я фактически имел в виду событие «редактирование строки завершено», когда редактор ячеек был перемещен в другую строку или просто был скрыт с некоторыми изменениями. Вы можете посмотреть на мое временное решение в ответах.
2. Не существует такого события, чтобы табулятор не учитывал изменения для каждой строки. Он рассматривает их только на уровне ячеек. Вы всегда можете просмотреть событие редактирования ячейки и посмотреть, является ли объект строки таким же, как при последнем вызове
Ответ №2:
На данный момент я нашел временное решение.
Прежде всего, я перехватываю cellEdited
, сохраняю текущую ячейку и запускаю таймер. Это необходимо определить, будет ли какой-либо редактор отображаться после текущего. Если таймер завершен, я понимаю, что выпуск строки завершен, и выполняю свою работу.
Затем я перехватываю cellEditing
, чтобы проверить, продолжается ли редактирование строк. Если cellEdition
срабатывает, проверьте наличие таймера, если он есть, остановите таймер и проверьте: находится ли текущая ячейка в строке с последней отредактированной ячейкой, если это так, ничего не делайте (редактирование строки продолжается), если это не так, выполняйте мою работу (редактирование последней строки завершено).
Вот часть моего углового контроллера с кодом:
editTimerId?: any;
lastEditedCell: Tabulator.CellComponent;
cellEditCompleted(cell: Tabulator.CellComponent) {
this.lastEditedCell = cell;
this.editTimerId = setTimeout(() => this.timerComplete(), 2000);
}
timerComplete() {
// Do the thing
}
cellEditingBegin(cell: Tabulator.CellComponent) {
if (this.editTimerId) {
clearTimeout(this.editTimerId);
this.editTimerId = null;
let lastRow = this.lastEditedCell.getRow();
if (cell.getRow() !== lastRow) {
// Do the thing
}
}
}
Я думаю, что это решение слишком сложное, поэтому, если у кого-то есть лучший способ, я буду рад его увидеть.