2009-06-23 10 views
48

I Avere la seguente funzione.Come si scrive una funzione jquery che accetta una richiamata come parametro

function ChangeDasPanel(controllerPath, postParams) { 

    $.post(controllerPath, postParams, function(returnValue) { 

     $('#DasSpace').hide("slide", { direction: "right" }, 1000, function() { 

      $('#DasSpace').contents().remove(); 

      $('#DasSpace').append(returnValue).css("display", "block"); 

      $('#DasSpace').show("slide", { direction: "right" }, 1000); 

     }); 

    }); 

}; 

ma voglio essere in grado di chiamare in questo modo

ChangeDasPanel("../Home/Test", {} ,function(){ 
    //do some stuff on callback 
} 

Come posso implementare il supporto per le richiamate nella mia funzione?

risposta

75
function ChangeDasPanel(controllerPath, postParams, f) { 
    $.get(
    controllerPath, 
    postParams, 
    function(returnValue) { 
     var $DasSpace = $('#DasSpace'); 
     $DasSpace.hide(
     "slide", { direction: "right" }, 1000, 
     function() { 
      $DasSpace.contents().remove(); 
      $DasSpace.append(returnValue).css("display", "block"); 
      $DasSpace.show("slide", { direction: "right" }, 1000); 
     } 
    ); 
     if (typeof f == "function") f(); else alert('meh'); 
    } 
); 
}; 

È possibile passare funzioni come qualsiasi altro oggetto in JavaScript. L'inoltro di una funzione di richiamata è semplice, lo fai anche tu stesso nella chiamata $.post().

È possibile decidere se si desidera che la richiamata venga richiamata come parte della richiamata $.post() o autonoma.

+0

esattamente quello che ho cercato di fare negli ultimi 30 minuti. Grazie! mi ha aiutato –

+0

Grazie per "if (typeof f ==" function ") f();" part. L'ho cercato! – Garavani

14

Se ho capito bene, è facile come impostare un altro parametro e chiamando la variabile in funzione:

function foo(mycallback) { 
    mycallback(); 
} 
11

Perché non si utilizza un oggetto che si può passare attraverso la funzione. È molto più simile a jQuery e ti salva con parametri con nome x che è difficile da mantenere in quanto può diventare pesante quando si superano 3 parametri.

esempio

function callingFunction(){ 

     var fnSettings: { 
     url: someUrl, 
     data: params, 
     callback : function(){} 
     }; 


     yourFunction(fnSettings); 

} 

function yourFunction(settings) { 

     $.post(settings.url, settings.data, settings.callback); 

} 
+0

Questa è sicuramente la risposta più pulita (ho scritto qualcosa di simile, quindi potrei essere di parte) – arviman

22

Voi sapete che le variabili e le funzioni globali sono il male, quindi perché non mettere i di nel namespace jQuery:

$.extend({ 
    myFunc : function(someArg, callbackFnk){ 
    var url = "http://example.com?q=" + someArg; 
    $.getJSON(url, function(data){ 

     // now we are calling our own callback function 
     if(typeof callbackFnk == 'function'){ 
     callbackFnk.call(this, data); 
     } 

    }); 
    } 
}); 

$.myFunc(args, function(){ 
    // now my function is not hardcoded 
    // in the plugin itself 
}); 

leggere questo post per ottenere una migliore comprensione: Creating callback functions in jQuery

+0

Cool. Come posso creare una funzione anonima come in Jquery '$ .hide (555, function()) {})' ?? Oppure callbackFnk è la risposta? – aleXela

+0

Yeap, 'callbackFnk' è solo una variabile locale. Come puoi vedere nell'esempio, stiamo passando una funzione anonima: '$ .myFunc (args, function() {})'. – Uzbekjon

+0

Grazie ancora! Ancora una domanda, sparerà dopo la fine della funzione principale? – aleXela

Problemi correlati