2011-01-13 3 views
5

Желаемое поведение:Добавление Droppables при перетаскивании Draggable

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

Это работало нормально. Я использую опцию «over» для droppables, чтобы развернуть узел и сделать дочерние элементы недоступными.

Но мне нужно было добавить еще несколько функций. Сначала я добавил помощника для перетаскивания. Все еще работает нормально. Затем я помещаю перетаскиваемые и распаковываемые в два разных контейнера (divs). В этот момент помощник не вытащил из контейнера. Решение состояло в том, чтобы установить «appendTo:« тело »на перетаскиваемые объекты. Все хорошо ... ну, не совсем.

Теперь дочерние узлы: не недоступен при текущей операции перетаскивания. Пользователь должен выпустить текущее перетаскивание и redrag в желаемый дочерний узел. Если я удалю параметр appendTo, проблема исчезнет, ​​но помощник не визуально переместится в контейнер с возможностью замены.

Есть ли какой-то способ, чтобы я мог «проснуться» с этими новыми droppables, чтобы сделать их немедленно недоступными?

ответ

6

Вот как я решил почти такую ​​же проблему. В моем случае, когда я переключаю узел открытым при перетаскивании перетаскиваемого, дочерние элементы загружаются через ajax, а затем они инициализируются как droppables. Тогда я должен сделать это:

ui.draggable.draggable('option', 'refreshPositions', true); 
var tempFunc = function() { 
    if (ui.draggable) { 
     ui.draggable.off('drag', tempFunc); 
     setTimeout(function() { 
      ui.draggable.draggable('option', 'refreshPositions', false); 
     }, 100); 
    } 
}; 
ui.draggable.on('drag', tempFunc); 

Это делает перетаскиваемые достаточно refreshPositions вариант, как true долго для новых droppables присоединиться к текущему сопротивлению. Вы также можете использовать опцию refreshPositions: true в течение всего перетаскивания, но это дает штраф за исполнение, которого я не хочу.

Я не нашел способ сделать это по-другому. Было бы лучше, если бы был метод, который вы могли бы вызвать во время перетаскивания только для обновления позиций, но нет.