我正在创建一个用户界面,允许用户通过拖放界面创建数据库表(及其字段和关系)。
这是我创建的jsFiddle,虽然它看起来很多,但它实际上只是展示问题所必需的最低限度。这是我的要求,jsPlumb分别处理得很漂亮,但是当我尝试将它们全部组合在一起时,我遇到了问题。特别是它将#2和#3结合起来是一个问题。
为了完成#4,我在表示字段的每个“tile”上调用jsPlumb.makeSource()和jsPlumb.makeTarget(),而不是在每个tile的右侧和左侧创建特定的端点。这样,jsPlumb可以管理将连接线重新绘制到更接近其连接的图块的“场”图块的任何一侧。
但是,为了完成#2,我将jQuery可排序应用于字段,以便为用户提供“拖动重新排序”功能。这会产生一个冲突,即当您单击某个字段时,您要求的“操作”...排序或启动jsPlumb连接?因此,对于每个字段,我附加一个红色div(带有一个“.item-hit.area”类),并在makeSource()调用中添加一个过滤器,以便只能使用该红色div来创建新的jsPlumb连接。
jsPlumb.makeSource($('.item'), {
filter:function(event, element) {
return ($(event.target).hasClass('item_hit_area'));
}
....
}
所以现在点击红色div告诉jsPlumb启动连接,或点击“field”元素中的任何其他地方传递给jQuery sortable()。
希望这些要求是明确的。以下是如何重现问题。
陌生人仍然是如果你拖动其他表(“我的所有酒吧”表),连接线会跳回到两端的正确位置。只有当您拖动jsPlumb连接的“源”侧的表时才会混淆并将该行拖到错误的位置。
答案 0 :(得分:0)
问题是jsPlumb缓存了一些可拖动的子元素的偏移量。因此,在排序后,您需要告诉jsPlumb重新计算这些偏移量,就像在这个小提琴中一样:
注意这一行:
jsPlumb.recalculateOffsets($(ui.item).parents(".draggable"));
在sortable的停止回调中。