Перетаскиваемый обратный вызов JQuery, вызываемый после сортировки из сортируемого - PullRequest
2 голосов
/ 24 августа 2009

У меня есть список перетаскиваемых объектов, связанных со списком сортируемых. Перетаскивание работает отлично, как и сортировка. Дело в том, что перед сортировкой списка мне нужно создать запись в БД (используя rails). Поэтому я использую $ .post, который работает нормально, но мне нужно изменить идентификатор вставленного элемента. Я делаю это, меняя идентификатор вставленного элемента с помощью обратного вызова $ .post. Работает нормально, но это происходит ПОСЛЕ рода. И если вам интересно, почему я не использовал перетаскиваемый обратный вызов stop, это потому, что он делает то же самое. Вот сокращенный код (удалены ненужные вещи из БД):

    $("#operations_container").sortable({items:'.process_small', axis:'y', update: function(ev,ui) {
    if (ui.item.attr('id').match("workcenter"))
    {
        $.post('/operations', 'fancyrailspoststuffignore', function(data) {
                    $("#operations_container > #workcenter_" + workcenterid).attr("id", "operation_" + data.operation.id);
                    }, "json");
    }   
    $.post('/jobs/sort/<%= @job.id %>', 'morefancyschamncyrailsjunk);
}});

Сортируемый контейнер прост:

<div id="operations_container" class="in_grid">
</div>

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

ОБНОВЛЕНИЕ: В случае, если они пропущены в комментариях, вот изображение и примеры файлов, иллюстрирующих проблему.

Изображение: http://dl.getdropbox.com/u/1826667/sortable.png Примеры файлов: http://dl.getdropbox.com/u/1826667/jquery_callback_order.zip

Таким образом, кажется, что обратные вызовы всегда заканчиваются в конце любых других событий независимо от того, где они вызываются (обратный вызов @ .post до того, как сортируемое обновление по-прежнему вызывается последним и т. Д.) Я не думаю, что это сбой в JQuery (хотя я нахожу это странным); Я пытаюсь сделать несколько постов (которые необходимы, поскольку они являются взаимозависимыми; создать запись, а затем отсортировать) за один раз, что, возможно, не является подходящим способом сделать это. Я попробую обойти это в бэкэнде (у меня что-то почти работает), поэтому я считаю это закрытым. Спасибо всем, кто помог с проблемой. ТАК правила.

MEGAIMPORTANTUPDATE: Это работает! Шон понял (см. Ответ), и я все еще немного легкомыслен. Это было несколько дней на эту вещь. Еще раз спасибо всем и особенно Шону. Вы качаетесь.

Ответы [ 2 ]

2 голосов
/ 26 августа 2009

Aha! Понял. Эта картина была именно тем, что мне было нужно. Вот что нужно сделать:

$("#operations_container").sortable({items:'.process_small', axis:'y', update: function(ev,ui) {
    var sortDbTable = function(){
        $.post('/jobs/sort/<%= @job.id %>', 'morefancyschamncyrailsjunk);
    }
    if (ui.item.attr('id').match("workcenter"))
    {
            $.post('/operations', 'fancyrailspoststuffignore', function(data) {
                                    $("#operations_container > #workcenter_" + workcenterid).attr("id", "operation_" + data.operation.id); //is there any reason you're not using the ui.item.attr("id",...) here?
                                    sortDbTable(); //this will make sure id is changed before DB sort
                                    }, "json");
    } else { //else not absolutely needed, but will make sure it's not unnecessarily sorted again
        sortDbTable();
    }
}});
0 голосов
/ 24 августа 2009

Перед событием обновления вызывается стартовое событие, вы можете использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...