2010-04-06 3 views
11

중첩 된 Ajax 'success'함수 내에서 $ (this)를 참조하는 데 문제가 있습니다 ... 범위 문제이지만 성공적인 업데이트에서 대화 상자를 닫을 수없는 깨끗한 방법을 찾지 못하는 것 같습니다. 어떤 도움을 주셔서 감사합니다.

$("#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

붐, 뱅, 징. 정확히 내가 무엇을 찾고 있었는지. 이 옵션에 대한 소문을들은 적이 있지만 찾지 못했습니다. 감사. – uberdanzik

+0

최고, 당신도 나를 도왔습니다. – Binaryrespawn

4

는이 같은, 그 변수의 사본이 필요합니다 : this는 수익의 다른 상황에 있기 때문에

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'); 
    } 
}); 

, 당신이 그것을 캡처 폐쇄로 전달해야 :)

+0

어. mo 'vars, mo'문제. –

+1

@Jonathan Julian - 이것들은 클로저 안의 변수들이다.'context :'는 몇 가지를 설정하지 않는다고 생각 하는가? :) –

+0

예,이 작동하지만 여분의 변수를 사용하지 않기를 바랬습니다 – uberdanzik

2

$.proxy()

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

으로 시도 할 수 있습니다 '통과' '위'에서 그 기능까지의 범위