jsPlumb makeSource() и jQuery sortable() плохо работают вместе

Я создаю пользовательский интерфейс, который позволяет пользователям создавать таблицы базы данных (и их поля и отношения) с помощью интерфейса перетаскивания.

Вот 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, чтобы опубликовать изображение. Но попробуйте, и вы увидите, что линия переходит не в то место.

Еще более странным является то, что если вы перетащите другую таблицу (таблицу «Все мои бары»), соединительная линия вернется в правильное положение на обоих концах. Только когда вы перетаскиваете таблицу, которая была на «исходной» стороне соединения jsPlumb, она запутывается и рисует линию не в том месте.


person user497587    schedule 05.11.2013    source источник
comment
как перетащить Foo 1 вниз в списке элементов внутри All my Foos. когда я попытался перетащить его, ничего не произошло. Вместо этого он начинает рисовать соединитель.   -  person Udit Bhardwaj    schedule 05.11.2013
comment
Моя ошибка, jsFiddle использовал jsPlumb 1.3.8, поэтому я изменил его на 1.5.3. Пожалуйста, попробуйте еще раз.   -  person user497587    schedule 06.11.2013
comment
jsfiddle в вашем вопросе все еще использует версию 1.3.8, я думаю, что вы либо забыли обновить скрипку, либо отредактировали ссылку в вопросе. однако вот ссылка jsfiddle.net/S7gVa/12, которую я добавил в версию 1.5.3. Теперь проблема в том, что перетаскивание элементов в таблице работает, но функция рисования соединителей не работает. Также была синтаксическая ошибка в части css .draggable, .draggable2 { } вы набрали background-colo line-break r: #e6e6e6   -  person Udit Bhardwaj    schedule 07.11.2013
comment
Я не знал, что jsFiddle включает номер версии в URL-адрес. Вот исправленный jsFiddle: jsfiddle.net/vcaha/S7gVa/13   -  person user497587    schedule 08.11.2013


Ответы (1)


Проблема в том, что jsPlumb кэширует смещения дочерних элементов некоторых перетаскиваемых объектов. Итак, после сортировки вам нужно указать jsPlumb пересчитать эти смещения, как в этой скрипте:

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

обратите внимание на строку:

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

в обратном вызове остановки sortable.

person Tony    schedule 20.11.2013
comment
Отличный материал. Спасибо! - person user497587; 01.01.2014