0

我在剑道网格行上定义了一个可拖动的,例如:

$(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,1 和 2 的 dataItem(element) 总是返回第 1 行的行数据(但这只发生在第一个项目已被放入放置区)。知道为什么会发生这种情况吗?这是剑道的内置功能。

4

1 回答 1

0

我发现了这个问题。

每当物品被丢弃时,我都会打电话:

e.draggable.currentTarget.remove(); 

在 Droppable 上,为了将其从包含网格中删除,但由于网格的数据源未刷新,项目将从网格中消失,但它们仍将包含在数据源中。在 Kendo 的 dataItem() 下方将根据其数组索引查找该项目,因为我们在网格上有 2 个项目,但在删除后 dataSource 上有 3 个项目,这将导致索引不匹配(因为数据源持有的前一个索引现在被另一个项目占据了)。

就个人而言,我认为 Telerik 应该考虑使用 guid 键而不是原始数组索引对其进行索引,这样就不会发生此类问题。

我现在将回调传递给包含 droparea 调用的闭包:

    refreshGrid: function () {
        grid.dataSource.read();
        grid.refresh();
    }

这解决了这个问题。

于 2018-12-14T15:16:50.297 回答