2010-03-08 3 views
19

J'utilise la fonction jQuery $ .ajax(). J'ai mis ceci dans une fonction parent, qui passe certaines valeurs dans la fonction ajax. Ce que je voudrais faire, est d'avoir une fonction de rappel définie par l'utilisateur, qui obtient le paramètre de données passé de la fonction de succès ajax.

Voici ce que je pensais fonctionnerait, mais ce n'est pas:

testFunc = function(str, callback) { 
    // Send our params 
    var data = 'some data to send'; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: data, 
     success: callback 
    }); 
} 

Ensuite, je veux être en mesure d'appeler cette fonction, et passer dans ma fonction personnalisée afin que je puisse utiliser les fonctions de succès données à l'intérieur de cette fonction:

testFunc('my string data', function(data){ 
    alert(data); 
}); 

Je voulais que ce soit le même que:

testFunc = function(str, callback) { 
    // Send our params 
    var data = 'some data to send'; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: data, 
     success: function(data) { 
      alert(data); 
     } 
    }); 
} 
+0

sont vous êtes sûr que vous obtenez un "succès"? – Jeremy

+0

Oui, je reçois des données grâce au "succès". –

Répondre

29

fonctionne bien pour moi:

<script src="/jquery.js"></script> 
<script> 
var callback = function(data, textStatus, xhr) 
{ 
    alert(data + "\t" + textStatus); 
} 

var test = function(str, cb) { 
    var data = 'Input values'; 
    $.ajax({ 
     type: 'post', 
     url: 'http://www.mydomain.com/ajaxscript', 
     data: data, 
     success: cb 
    }); 
} 
test('Hello, world', callback); 
</script> 
+0

Vous ne savez pas ce que je manquais, mais en suivant votre exemple, cela a fonctionné parfaitement. Merci! –

1

Je crois que votre problème est que vous passez TestFunct une chaîne, et non un objet de fonction, (est-ce possible?)

1

Bien que je ne suis pas sûr à 100% ce que vous voulez (probablement mon cerveau est lent aujourd'hui), est ici un exemple d'utilisation similaire à ce que vous décrivez:

function GetProcedureById(procedureId) 
{ 
    var includeMaster = true; 
    pString = '{"procedureId":"' + procedureId.toString() + '","includeMaster":"' + includeMaster.toString() + '"}'; 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: pString, 
     datatype: "json", 
     dataFilter: function(data) 
     { 
      var msg; 
      if (typeof (JSON) !== 'undefined' && 
        typeof (JSON.parse) === 'function') 
       msg = JSON.parse(data); 
      else 
       msg = eval('(' + data + ')'); 
      if (msg.hasOwnProperty('d')) 
       return msg.d; 
      else 
       return msg; 
     }, 
     url: "webservice/ProcedureCodesService.asmx/GetProcedureById", 
     success: function(msg) 
     { 
      LoadProcedure(msg); 
     }, 
     failure: function(msg) 
     { 
      // $("#sometextplace").text("Procedure did not load"); 
     } 
    }); 
}; 
/* build the Procedure option list */ 
function LoadProcedure(jdata) 
{ 
    if (jdata.length < 10) 
    { 
     $("select#cptIcdProcedureSelect").attr('size', jdata.length); 
    } 
    else 
    { 
     $("select#cptIcdProcedureSelect").attr('size', '10'); 
    }; 
    var options = ''; 
    for (var i = 0; i < jdata.length; i++) 
    { 
     options += '<option value="' + jdata[i].Description + '">' + jdata[i].Description + ' (' + jdata[i].ProcedureCode + ')' + '</option>'; 
    }; 
    $("select#cptIcdProcedureSelect").html(options); 
}; 
2

Dans le premier bloc de code, vous ne jamais utiliser le paramètre str. Vouliez-vous dire ce qui suit?

testFunc = function(str, callback) { 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: str, 
     success: callback 
    }); 
} 
2

Voilà comment je le fais

function run_ajax(obj) { 
    $.ajax({ 
     type:"POST", 
     url: prefix, 
     data: obj.pdata, 
     dataType: 'json', 
     error: function(data) { 
      //do error stuff 
     }, 
     success: function(data) { 

      if(obj.func){ 
       obj.func(data); 
      } 

     } 
    }); 
} 

alert_func(data){ 
    //do what you want with data 
} 

var obj= {}; 
obj.pdata = {sumbit:"somevalue"}; // post variable data 
obj.func = alert_func; 
run_ajax(obj); 
+0

Je suis sûr que vous ne déclarez pas séparément des propriétés d'objet comme ça pour un simple cas d'utilisation, pourquoi ne pas utiliser un littéral d'objet? Puis-je demander quel effet cela a sur GC dans JS? – MrMesees

21

Vous pouvez utiliser ce mot-clé pour accéder à des données personnalisées, transmises à .ajax $() fonction:

$.ajax({ 
     // ... // --> put ajax configuration parameters here 
     yourCustomData: {param1: 'any value', time: '1h24'}, // put your custom key/value pair here 
     success: successHandler 
    }); 

    function successHandler(data, textStatus, jqXHR) { 
     alert(this.yourCustomData.param1); // shows "any value" 
     console.log(this.yourCustomData.time); 
    } 
+0

C'est une façon agréable et propre de le faire sans créer de nouvelles fonctions. Je vous remercie! – Acyra

Questions connexes