【问题标题】:jsPlumb makeSource() and jQuery sortable() not working well togetherjsPlumb makeSource() 和 jQuery sortable() 不能很好地协同工作
【发布时间】:2013-11-05 03:35:57
【问题描述】:

我正在创建一个用户界面,允许用户通过拖放界面创建数据库表(及其字段和关系)。

这是我创建的jsFiddle,虽然它看起来有很多事情要做,但实际上它只是演示问题所需的最低限度。这是我的要求,jsPlumb 可以很好地单独处理这些要求,但是当我尝试将它们全部一起完成时遇到了问题。特别是,它结合了 #2 和 #3 是一个问题。

  1. “表格”可以在画布周围拖动(使用 jsPlumb.draggable())
  2. 表格中的“字段”可以通过向上/向下拖动来重新排序(使用jQuery sortable())
  3. 用户可以通过拖动在两个不同表格的字段之间绘制新的“关系”
  4. 任何两个表之间的连接线应在拖动表时自动重新绘制,以便它们始终连接到/从最靠近“另一个表”的一侧

为了完成 #4,我在每个表示字段的“图块”上调用 jsPlumb.makeSource() 和 jsPlumb.makeTarget(),而不是在每个图块的右侧和左侧创建特定端点。这样,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 启动一个连接,或者点击“字段”元素中的任何其他地方都会传递给 jQuery sortable()。

希望这些要求很明确。这是重现问题的方法。

  • 从“Foo 1”上的红色图块拖动到“Bar 2”的主体以在两个表之间绘制新关系
  • 拖动 foos 表(按其标题)以查看 #4 是否正常工作(所有行都正确重绘)
  • 现在将“Foo 1”在“All my Foos”内的项目列表中向下拖动,这样它就不再是列表中最顶部的项目,而是第二个或第三个项目。到目前为止一切顺利,当您拖动时,jsPlumb 会继续正确更新连接线
  • 当您拖动 Foos 表来移动它时,就会出现问题。一旦你这样做了,突然连接“Foo 1”和“Bar 2”的线就在错误的地方。不幸的是,我在 stackoverflow 上没有足够的声誉来发布图片。但是尝试一下,您会发现线路跳错了位置。

更奇怪的是,如果你拖动 other table(“All my Bars”表),连接线会跳回两端的正确位置。只有当您拖动位于 jsPlumb 连接的“源”端的表格时,它才会混淆并在错误的位置画线。

【问题讨论】:

  • 如何在“All my Foos”内的项目列表中向下拖动“Foo 1”。当我试图拖动它时,什么也没发生。它开始绘制连接器。
  • 我的错,jsFiddle使用的是jsPlumb 1.3.8,所以我把它改成了1.5.3。请重试。
  • jsfiddle 在您的问题中仍在使用 1.3.8 版本,我认为您要么忘记更新小提琴或编辑问题中的链接。但是这里是jsfiddle.net/S7gVa/12 链接,我添加了 1.5.3 版本。现在的问题是拖动表格中的项目正在工作,但连接器绘图功能不起作用。在 css 部分 .draggable, .draggable2 { } 中也存在语法错误,您输入了 background-colo line-break r: #e6e6e6
  • 我没有意识到 jsFiddle 在 url 中包含修订号。这是更正后的 jsFiddle:jsfiddle.net/vcaha/S7gVa/13

标签: jquery jsplumb


【解决方案1】:

问题是jsPlumb缓存了一些可拖动的子元素的偏移量。所以在你排序之后,你需要告诉 jsPlumb 重新计算这些偏移量,就像在这个小提琴中一样:

http://jsfiddle.net/S7gVa/17/

注意这条线:

        jsPlumb.recalculateOffsets($(ui.item).parents(".draggable"));

在 sortable 的停止回调中。

【讨论】:

  • 好东西。谢谢!
猜你喜欢
  • 2016-12-08
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 2018-01-18
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多