2010-05-24 2 views
1

Я в настоящее время имеют код, подобный этому для формы:JQuery: Как бороться с «это» в AJAX обратных вызовов

$('#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, на функцию обратного вызова? Поскольку я знаю идентификатор прямо сейчас, я могу обойти его, выполняя то, что я сделал, но я хотел бы знать, как не быть зависимым от знания идентификатора, поскольку часто у меня нет идентификатора. (Например, если у меня есть ссылка в каждой строке таблицы, и все строки имеют один и тот же обработчик кликов.

ответ

2

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

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

Таким образом, переменная с формой будет доступна внутри обратного вызова. при объявлении функции, эта функция будет иметь доступ ко всем переменным в том же объеме, даже если она называется после того, как функция, о которой было заявлено, вернулась.

Вы можете прочитать о закрытии деталей по адресу: http://www.jibbering.com/faq/notes/closures/

+0

Кажется, работает хорошо! – Svish

+0

Рад слышать! :) – baloo

0

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

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

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

В общем, у вас будет только один элемент формы. Поэтому нет необходимости создавать ссылку внутри функции отправки, обертывая 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; 
}); 
+0

В genereal мне это нужно для других вещей, кроме форм. Поэтому я не хочу ссылаться на все, что есть, так как их будет довольно много, и они будут удалены и добавлены и такие. – Svish

0

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

$('#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/articles/scope_in_javascript/ Просто Google это

+0

Интересно. Когда я пытаюсь это сделать, я получаю сообщение об ошибке, заявляя, что bind не является функцией, хотя ... – Svish

+0

@mathk: Я думаю, вы сбиваете с толку функцию bind() MooTools. Функция bind() существует в jQuery, но она не имеет того же значения: она используется для присоединения событий. – mexique1

+0

На самом деле я смущаюсь с bind() в библиотеке Prototype. сожалею – mathk

Смежные вопросы