2011-01-13 11 views
5

Comportamento desiderato:Aggiunta di oggetti dimenticabili durante il trascinamento di Draggable

L'utente trascina un oggetto su un albero. Al passaggio del mouse su un nodo chiuso, il nodo si espande rivelando i bambini. A questo punto, l'utente può continuare a trascinare verso i nodi figlio e rilasciarne uno qualsiasi.

Questo funzionava bene. Io uso l'opzione "over" dei droppabili per espandere il nodo e rendere i bambini trascinabili.

Ma avevo bisogno di aggiungere altre funzionalità. Per prima cosa ho aggiunto un helper per i draggables. Funziona ancora bene. Poi ho messo i draggables e droppable in due contenitori diversi (div). A questo punto, l'aiutante non si trascina fuori dal contenitore. La soluzione era impostare "appendTo: 'body'" sui dispositivi mobili. Tutto bene ... beh, non proprio.

Ora i nodi figlio sono non trascinabili durante l'operazione di trascinamento corrente. L'utente deve rilasciare il trascinamento corrente e la redrag nel nodo figlio desiderato. Se rimuovo l'opzione appendTo, il problema scompare, ma l'helper non si sposta visivamente nel contenitore droppable.

C'è un modo in cui posso "svegliare" questi nuovi droppabili per renderli immediatamente trascinabili?

risposta

6

Ecco come ho risolto quasi lo stesso problema. Nel mio caso quando altero il nodo aperto durante il trascinamento di un oggetto trascinabile, gli elementi figlio vengono caricati tramite ajax e quindi vengono inizializzati come file droppabili. Poi devo fare questo:

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

Questo rende il trascinabile hanno refreshPositions opzione come true abbastanza a lungo per i nuovi droppables ad aderire al trascinamento corrente. È inoltre possibile che l'opzione refreshPositions sia true durante l'intera resistenza, ma fornisce una penalizzazione delle prestazioni che non desidero.

Non ho trovato un modo per farlo in un altro modo. Sarebbe meglio se esistesse un metodo da chiamare durante il trascinamento solo per rinfrescare le posizioni, ma non lo è.