2011-01-13 21 views
5

El comportamiento deseado:Agregar objetos que se pueden arrastrar mientras se arrastra Draggable

El usuario arrastra un elemento en un árbol. Al pasar el ratón sobre un nodo cerrado, el nodo se expande y revela a los niños. En este punto, el usuario puede seguir arrastrando a los nodos secundarios y soltar cualquiera de ellos.

Esto funcionaba bien. Utilizo la opción "sobre" de los elementos desplegables para expandir el nodo y hacer que los niños sean desplegables.

Pero necesitaba agregar algunas características más. Primero agregué un ayudante para los juegos de arrastre. Sigue trabajando bien. Luego coloco los juegos de arrastre y los elementos que se pueden arrastrar en dos contenedores diferentes (divs). En este punto, el ayudante no se arrastrará fuera del contenedor. La solución fue establecer "appendTo: 'body'" en los juegos de arrastre. Todo bien ... bueno, no del todo.

Ahora los nodos secundarios son no desplegables durante la operación de arrastre actual. El usuario debe liberar el arrastre actual y el redrag en el nodo secundario deseado. Si elimino la opción appendTo, el problema desaparece, pero luego el ayudante no se mueve visualmente al contenedor desplegable.

¿Hay alguna forma de que pueda "despertar" estos nuevos elementos que se pueden soltar para que se puedan eliminar inmediatamente?

Respuesta

6

Así es como obtuve casi el mismo problema resuelto. En mi caso, al alternar el nodo abierto durante el arrastre de un elemento que se puede arrastrar, los elementos secundarios se cargan mediante ajax y luego se inicializan como elementos que se pueden quitar. Entonces tengo que hacer esto:

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); 

Esto hace que se pueda arrastrar el refreshPositions tienen opción como true tiempo suficiente para que las nuevas droppables para unirse a la resistencia efectiva. También puede hacer que la opción refreshPositions sea true durante todo el arrastre, pero da una penalización de rendimiento que no quiero.

No encontré la manera de hacerlo de otra manera. Sería mejor si hubiera un método que pudiera llamar durante la operación de arrastre solo para refrescar las posiciones, pero no es así.

Cuestiones relacionadas