2010-04-06 3 views
11

Имея проблемы со ссылкой на $ (this) изнутри вложенной функции успеха ajax ... Я знаю, что это проблема с областью, но не может найти чистый способ закрыть диалог при успешном обновлении. Спасибо за любую помощь.

$("#dialog_support_option_form").dialog({ 
     width: 400, 
     height: 180, 
     bgiframe: true, 
     autoOpen: false, 
     modal: true, 
     buttons: { 
      'Save Support Option': function(){ 
       $.ajax({ 
        type: 'POST', 
        url: "support_options/create_support_option.php", 
        data: $(this).find('form').serialize(), 
        success: function(data){ 
         $("#list_support_options").html(data); 
         $(this).dialog('close'); 
        } 
       }); 
      }, 
      'Cancel': function(){ 
       $(this).dialog('close'); 
      } 
     }, 
     close: function(){ 
      $(this).find('input').val(''); 
     } 
    }); 

ответ

21

Вы должны использовать опцию ajax context: $(this),, чтобы задать область для обратных вызовов для выбранного элемента.

+0

бум, чел, zing. Именно то, что я искал. Слышал слух об этом варианте, но не смог найти его. Благодарю. – uberdanzik

+0

Превосходно, ты тоже помог мне – Binaryrespawn

4

Вы должны иметь копию этой переменной, например:

var dlg = $(this); 
$.ajax({ 
    type: 'POST', 
    url: "support_options/create_support_option.php", 
    data: $(this).find('form').serialize(), 
    success: function(data){ 
    $("#list_support_options").html(data); 
    dlg.dialog('close'); 
    } 
}); 

Поскольку this находится в другом контексте возвращения, вы должны захватить его и передать его в крышку :)

+0

eh. mo 'vars, mo' проблемы. –

+1

@Jonathan Julian - Все это переменные внутри замыкания, вы думаете, что 'context:' не устанавливает несколько? :) –

+0

да, это работает, но я надеялся не использовать дополнительную переменную – uberdanzik

2

Попробуйте с $.proxy()

success: $.proxy(function(data){ 
    $(this).dialog('close'); 
}, this); 

Вы можете 'пройти' область от «выше» до функции с ней