dataItem(element) возвращает неверный элемент внутри KendoDraggable - KendoUI JQuery
У меня есть перетаскиваемый определено в строках сетки кендо, как:
$(grid.element).kendoDraggable({
filter: "table > tbody > tr.grid-row.k-master-row",
group: "grid-items",
hint: function (element) {
grid.collapseRow(element);
element.addClass("k-state-selected");
var template = kendo.template($("#grid-item-moving-template").html());
console.log(element);
var data = grid.dataItem(element);
console.log(data);
var hint = $(template(data));
return hint;
},
cursorOffset: { top: 15, left: 30 }
});
Я заметил, что если я начинаю перетаскивать элементы, первый отображается правильно, но если я перетаскиваю первый элемент в зону сброса и начинаю перетаскивать второй элемент, шаблон подсказки второго элемента содержит определение первого элемента.
Вот тут-то и происходит странная часть. Я подробно описал добавление определения в журналы консоли функции подсказки 2: один с переданным элементом, а другой - фактические данные, возвращенные из сетки, извлеченной с помощью dataItem(). Хотя элемент всегда корректен, если я начинаю перетаскивать 1, я получаю 1, если я начинаю перетаскивать 2, я получаю 2, dataItem (элемент) как для 1, так и для 2 всегда возвращает данные строки для строки 1 (но это происходит, только если первый предмет уже был сброшен в дропзону). Есть идеи, почему это может происходить? Это встроенная функция кендо.
1 ответ
Я нашел проблему.
Всякий раз, когда предмет будет уронен, я позвоню:
e.draggable.currentTarget.remove();
В Droppable, чтобы удалить его из содержащей сетки, но поскольку источник данных для сетки не обновлялся, элементы будут исчезать из сетки, но они все равно будут содержаться в источнике данных. Под Kendo dataItem() будет искать элемент на основе его индекса массива, так как у нас было 2 элемента в сетке, но 3 элемента в dataSource после удаления, что привело бы к несоответствию индекса (так как предыдущий индекс содержался в dataSource был теперь занят другим предметом).
Лично я считаю, что Telerik должен рассмотреть возможность индексации его с помощью ключа guid, а не необработанного индекса массива, чтобы такие проблемы не возникали.
Теперь я передаю обратный вызов в замыкание, содержащее вызов droparea:
refreshGrid: function () {
grid.dataSource.read();
grid.refresh();
}
И это решило проблему.