2011-06-17 9 views
11

Mam element dający się przeciągnąć z zestawem helper: 'clone', ale gdy klony elementu, żaden z data() lub zdarzeń nie są trwałe w nowym elemencie.Podczas klonowania obiektu przeciągalnego w jQuery UI, w jaki sposób można przenieść dane i zdarzenia do nowego elementu?

Próbowałem na kilka sposobów, aby ponownie podłączyć data(), ale nie mogę wybrać nowego elementu, jak również starego elementu w tej samej instrukcji.

Na przykład, można wybrać początkowy element Draggable stop() imprezy:

$blah.draggable({ 
    helper: 'clone', 
    stop: function(ev, ui) { 
     var oldData = $(ev.target).data('blah'); 
    } 
}); 

I mogę też dostać nowy element w droppable drop() imprezy:

$blah.droppable({ 
    drop : function(ev, ui) { 
     var $newElement = ui.draggable; 
    } 
}); 

ale mogę wymyślić sposób, aby uzyskać oba w tym samym wydarzeniu.

Co chciałbym zrobić to w jakiś sposób przesłać dane np:

$newElement.data('blah', $oldElement.data('blah')); 

lub w inny sposób dane trwałe, jak można z $blah.clone(true);

Odpowiedz

2

nie pracował zbyt intensywnie z podrzucane, ale czy nie mógłbyś po prostu zrobić czegoś takiego?

$(".draggable").draggable({ 
    helper: 'clone' 
}); 

$("#droppable").droppable({ 
    drop: function(ev, ui) { 
     $(this).append(ui.draggable.clone(true)); 
    } 
}); 

wydaje się działać, chyba, że ​​coś mi brakuje:

http://jsfiddle.net/hasrq/

+0

Ponownie przeczytaj pytanie, "ui.draggable" nie wydaje się być nowym elementem, o którym wspomniałeś, ale raczej oryginałem. –

+0

Hej, to naprawdę postawiło mnie na dobrej drodze, ponieważ okazuje się, że problem polegał na tym, że łączyłem go z sortable(), w którym powstał problem. Zamieszczam poniżej moje rozwiązanie. Ale dziękuję za pomoc w tej sprawie! –

+0

Cóż, jeśli używasz sortable może to być pomocne: http://stackoverflow.com/questions/5788391/jquery-how-to-update-draggable-clone-id/5864644#5864644 –

1

Okazuje się, że problem był sortable, nie przeciągać/droppable (ja mocowania sortable później, ale pomyślałem, że nie był część problemu, więc zostawiłem to z pierwotnego pytania).

skończyło się używając rodzaju kombinacji użytkownika @ kingjiv rozwiązania powyżej, wraz z nie-do-największego włamania, ale przynajmniej wydaje się działać:

$blah.sortable({ 
    receive: function(ev, ui) { 
     // setting a global variable here 
     MyGlobals.cloneCache = ui.item.clone(true); 
    }, 
    stop: function(ev, ui) { 
     $(ui.item).replaceWith(MyGlobals.cloneCache); 
    } 
}); 

Chodzi o to, że po raz pierwszy klon oryginalną pozycję w zdarzeniu , przechowuj ją w pamięci podręcznej w zmiennej, a następnie zamień element na ten w zdarzeniu stop().

Trochę brzydka, ale przynajmniej działa.

+0

Właściwie to miało inne problemy, ponieważ kiedy próbowałeś przeciągnąć, aby ponownie sortować, wyciągnął z oryginalnego elementu, ugh. Teraz mam naprawdę okropny hack w miejscu, w którym przechowuję potrzebne dane w odbiorze, a następnie stosuję je w stop, ale tylko wtedy, gdy inny element danych "isChanged" nie został jeszcze zastosowany (albo pamięć podręczna zostanie pobrana zadzwonił i przesłał dane o ponownym sortowaniu) ... super brzydki, ale działający afaik –

+0

Otrzymuję ten sam typ problemu. Czy mógłbyś opublikować kod, który rozwiązał twój problem? –

14

Aby uzyskać dostęp do danych pierwotnego elementu w spadku można użyć ui.draggable.context. W poniższym przykładzie kontekst odnosi się do oryginalnego przeciągniętego elementu i masz dostęp do całej jego zawartości. "Przeciągnij" oznacza nowy element, który jest upuszczany.

$("#droppable").droppable({ 
    drop: function(ev, ui) {   
     console.log(ui); 
     console.log(ui.draggable.context); 
     console.log($(ui.draggable.context).data('pic')); 
    } 
}); 
+0

Doskonale, dzięki. To bardzo upraszcza. – Derrick

+0

To naprawdę działa! –

+1

Odpowiadam na te 4 lata po opublikowaniu i być może api się zmieniło (używam JqueryUI 1.11), ale nie widzę właściwości 'ui.draggable', o której tutaj wspomniano. Jednak znalazłem odniesienie do oryginalnego kontenera mojego przeciągniętego obiektu przez '$ (e.currentTarget.activeElement) .closest (" # my_container ")'. Nie ma 'ui.draggable.context', ale raczej' ui.helper.context'. – itsmikem

1

ui.item odnosi się do przeciągniętego przedmiotu. Kiedy skopiowany element jest klonowany, nie ma wbudowanego sposobu dostępu do elementu docelowego z funkcji receive. Jest jednak trochę hackowaty sposób, aby to zrobić:

$blah.sortable({ 
    receive: function (ev, ui) { 
     var $target = $(this).data().sortable.currentItem; 
     var $source = $(ui.sender); 
     // now you can copy data from source to target 
     $target.data('data-item', $source.data('data-item')); 
    } 
}); 
+0

W najnowszej wersji jquery-ui możesz uzyskać dostęp do elementu docelowego za pomocą 'ui.helper' – IanB

Powiązane problemy