2009-06-23 11 views
48

Mam następującą funkcję.Jak napisać funkcję jquery, która akceptuje wywołanie zwrotne jako parametr

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

     }); 

    }); 

}; 

Ale chcę, aby móc nazwać się ten

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

Jak mogę wdrożyć wsparcie dla wywołania zwrotne w mojej funkcji?

Odpowiedz

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

Możesz przekazywać funkcje, jak każdy inny obiekt w JavaScript. Przekazywanie funkcji wywołania zwrotnego jest proste, można to nawet zrobić samodzielnie w rozmowie $.post().

Możesz zdecydować, czy chcesz, aby Twój callback był wywoływany jako część połączenia zwrotnego $.post() lub osobno.

+0

dokładnie to, co próbowałem zrobić przez ostatnie 30 minut. Dzięki! pomógł mi –

+0

Dzięki za "if (typeof f ==" function ") f();" część. Szukałem tego! – Garavani

14

Jeśli rozumiem zostanie poprawnie, to tak łatwe, jak ustawienie inny parametr i wywołanie zmiennej w funkcji:

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

Dlaczego nie można użyć obiektu, który można przechodzi do funkcji. Jest znacznie bardziej podobny do jQuery i oszczędza ci parametrów o nazwach x, które są trudne do utrzymania, ponieważ mogą stać się nieporęczne, gdy przejdziesz przez 3 parametry.

np

function callingFunction(){ 

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


     yourFunction(fnSettings); 

} 

function yourFunction(settings) { 

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

} 
+0

To zdecydowanie najczystsza odpowiedź (napisałem coś podobnego, więc mogę być stronniczy) – arviman

22

Wiesz, że zmienne i funkcje globalne są złe, więc dlaczego nie umieścić swoje przyłącza się do nazw 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 
}); 

Przeczytaj ten artykuł, aby uzyskać lepsze zrozumienie: Creating callback functions in jQuery

+0

Fajnie. Jak mogę utworzyć funkcję anonimową jak w samym Jquery '$ .hide (555, function()) {})' ?? Lub callbackFnk jest odpowiedzią? – aleXela

+0

Yeap, 'callbackFnk' jest po prostu zmienną lokalną. Jak widać w przykładzie, przekazujemy anonimową funkcję: '$ .myFunc (args, function() {})'. – Uzbekjon

+0

Dzięki jeszcze raz! Jeszcze jedno pytanie, czy wystrzeli po zakończeniu głównej zabawy? – aleXela

Powiązane problemy