Как дублировать элемент при использовании сортировки jquery? - PullRequest
54 голосов
/ 04 августа 2011

Я использую этот метод http://jqueryui.com/demos/sortable/#connect-lists, чтобы соединить два списка, которые у меня есть. Я хочу иметь возможность перетаскивать из списка A в список B, но когда элемент будет удален, мне нужно сохранить исходный элемент в списке A. Я проверил параметры и события, но я считаю, что ничего подобного нет. Любые подходы?

Ответы [ 6 ]

83 голосов
/ 30 сентября 2012
$("#sortable1").sortable({
    connectWith: ".connectedSortable",
    forcePlaceholderSize: false,
    helper: function (e, li) {
        copyHelper = li.clone().insertAfter(li);
        return li.clone();
    },
    stop: function () {
        copyHelper && copyHelper.remove();
    }
});
$(".connectedSortable").sortable({
    receive: function (e, ui) {
        copyHelper = null;
    }
});
27 голосов
/ 07 ноября 2013

Решение Erez 'работает для меня, но я обнаружил, что отсутствие инкапсуляции разочаровывает.Я бы предложил использовать следующее решение, чтобы избежать использования глобальной переменной:

$("#sortable1").sortable({
    connectWith: ".connectedSortable",

    helper: function (e, li) {
        this.copyHelper = li.clone().insertAfter(li);

        $(this).data('copied', false);

        return li.clone();
    },
    stop: function () {

        var copied = $(this).data('copied');

        if (!copied) {
            this.copyHelper.remove();
        }

        this.copyHelper = null;
    }
});

$("#sortable2").sortable({
    receive: function (e, ui) {
        ui.sender.data('copied', true);
    }
});

Вот jsFiddle: http://jsfiddle.net/v265q/190/

25 голосов
/ 04 августа 2011

Для начала посмотрите на и прочитайте ответ @Erez.

$(function () {
    $("#sortable1").sortable({
        connectWith: ".connectedSortable",
        remove: function (event, ui) {
            ui.item.clone().appendTo('#sortable2');
            $(this).sortable('cancel');
        }
    }).disableSelection();

    $("#sortable2").sortable({
        connectWith: ".connectedSortable"
    }).disableSelection();
});
7 голосов
/ 17 марта 2015

Я знаю, что это старый, но я не мог получить ответ Эреза на работу, и Торстен не сократил его для проекта, для которого он мне нужен.Кажется, это работает именно так, как мне нужно:

$("#sortable2, #sortable1").sortable({
    connectWith: ".connectedSortable",
    remove: function (e, li) {
        copyHelper = li.item.clone().insertAfter(li.item);
        $(this).sortable('cancel');
        return li.clone();
    }
}).disableSelection();
5 голосов
/ 07 мая 2017

Ответ abuser2582707 работает лучше всего для меня.За исключением одной ошибки: вам нужно изменить возврат на

return li.item.clone();

Так должно быть:

$("#sortable2, #sortable1").sortable({
    connectWith: ".connectedSortable",
    remove: function (e, li) {
        li.item.clone().insertAfter(li.item);
        $(this).sortable('cancel');
        return li.item.clone();
    }
}).disableSelection();
0 голосов
/ 14 января 2015

При использовании решения Эреза, но для подключения 2 сортируемых портлетов (в качестве примера использовался код примера портлета из http://jqueryui.com/sortable/#portlets),, переключение на клон не будет работать. Я добавил следующую строку перед 'return li.clone ();'чтобы заставить его работать.

copyHelper.click(function () {
    var icon = $(this);
    icon.toggleClass("ui-icon-minusthick ui-icon-plusthick");
    icon.closest(".portlet").find(".portlet-content").toggle();
});

Мне потребовалось некоторое время, чтобы понять, поэтому я надеюсь, что это кому-нибудь поможет.

...