2010-04-06 7 views
11

Problèmes de référencement de $ (this) à l'intérieur de la fonction ajax 'success' imbriquée ... Je sais que c'est un problème de portée, mais je n'arrive pas à trouver un moyen de fermer le dialogue sur une mise à jour réussie. Merci pour toute aide.

$("#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(''); 
     } 
    }); 

Répondre

21

Vous devez utiliser l'option ajax context: $(this), pour définir l'étendue des rappels pour l'élément sélectionné.

+0

boom, bang, zing. Exactement ce que je cherchais. Entendu une rumeur à propos de cette option, mais ne pouvait pas le trouver. Merci. – uberdanzik

+0

Superbe, tu m'as aussi aidé – Binaryrespawn

4

Vous devez avoir une copie de cette variable, comme ceci:

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

Depuis this est dans un contexte différent sur le retour, vous avez besoin de le capturer et de le transmettre dans la fermeture :)

+0

eh. mo 'vars, mo' problèmes. –

+1

@Jonathan Julian - Tous ces éléments sont des variables à l'intérieur d'une fermeture, vous pensez que 'context:' n'en définit pas quelques-uns? :) –

+0

oui, cela fonctionne, mais j'espérais ne pas utiliser une variable supplémentaire – uberdanzik

2

Essayez avec $.proxy()

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

Vous pouvez 'pass' la portée de 'above' à une fonction avec celle-ci