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();
    }

И это решило проблему.

Другие вопросы по тегам