JQuery: как бороться с этим в обратных вызовах AJAX - PullRequest
1 голос
/ 24 мая 2010

В настоящее время у меня есть код, подобный этому для формы:

$('#some-form')
    .submit(function()
    {
        // Make sure we are not already busy
        if($(this).data('busy'))
            return false;
        $(this).data('busy', true);

        // Do post
        $.post("some/url", $(this).serialize(), function(data)
        {
            if(data.success) // Success is a boolean I set in the result on the server
            {
                // Deal with data
            }
            else
            {
                // Display error
            }

            $('#some-form')
                .removeData('busy');
        });
        return false;
    });

Моя проблема заключается в том, что я хотел бы как-то убрать необходимость знания идентификатора формы в обратном вызове после записи.В конце, когда я удаляю данные busy из формы, я бы хотел как-то не так жестко кодировать.Есть ли способ, которым я могу сделать это?Есть ли способ передать все, что находится в this, функции обратного вызова?Поскольку я знаю идентификатор прямо сейчас, я могу обойти его, делая то, что я сделал, но я хотел бы знать, как не зависеть от знания идентификатора, поскольку часто у меня нет идентификатора.(Например, если у меня есть ссылка в каждой строке таблицы и все строки имеют одинаковый обработчик кликов.

Ответы [ 3 ]

2 голосов
/ 24 мая 2010

Установите переменную со значением «this» перед созданием обратного вызова.Затем используйте это имя переменной в функции обратного вызова.

var form = this;
$.post("some/url", $(this).serialize(), function(data) {
      $(form).removeData('busy');
}

Таким образом, переменная с формой будет доступна внутри обратного вызова.Когда вы объявляете функцию, эта функция будет иметь доступ ко всем переменным в той же области видимости, даже если она вызывается после возврата функции, в которой она была объявлена.1006 *http://www.jibbering.com/faq/notes/closures/

0 голосов
/ 24 мая 2010

Используйте привязку

$('#some-form')
.submit(function()
{
    // Make sure we are not already busy
    if($(this).data('busy'))
        return false;
    $(this).data('busy', true);

    // Do post
    $.post("some/url", $(this).serialize(), function(data)
    {
        if(data.success) // Success is a boolean I set in the result on the server
        {
            // Deal with data
        }
        else
        {
            // Display error
        }


        $(this).removeData('busy');

    }.bind(this)); //Here
    return false;
});

Вы можете найти интересную статью о сфере действия JavaScript: http://www.digital -web.com / статьи / scope_in_javascript / Просто погуглите это

0 голосов
/ 24 мая 2010

Сохраните ссылку на форму.

var form = $("form").submit(function ()
{
    // do ajax call here, referencencing the "form" variable

    return false; // return false to prevent default behavior
});

Как правило, вы будете иметь дело только с одним элементом формы. Поэтому нет необходимости создавать ссылку внутри функции submit, оборачивая this в объект jQuery.

Вот ваш модифицированный код:

var form = $("#some-form").submit(function ()
{
    if(form.data("busy")) return false;

    form.data("busy", true);

    $.post("some/url", form.serialize(), function (data)
    {
        if (data.success)
        {
        }
        else
        {
        }

        form.removeData("busy");
    });

    return false;
});
...