Paraméter átadás – Ajax és OnComplete

prototypeAz Ajax.Updater prototype objektum használatakor előbb-utóbb beleütközünk abba a problémába, hogy szeretnénk használni az OnComplete tulajdonságot. Ez még nem olyan baj, de ha szeretnénk neki paramétereket is átadni akkor meglepetések fognak érni.
Ha az Ajax.Updater-t használjuk akkor valami ilyesmi lesz a kódunk:

new Ajax.Updater(
   $('ajaxinfodiv'),
   'ajaxlekerdezo.php', 
   {
      method:'get',
      onComplete:leKerdezesKesz
   });

Ez azt fogja csinálni, hogy amikor az AJAX kommunikáció az onComplete szakaszba ér, akkor meghívja és végrehajtja a leKerdezesKesz() függvényt.

A probléma

A dolog akkor kezd érdekessé válni, amikor a leKerdezesKesz() függvénynek szeretnénk átadni egy (vagy több) paramétert.

new Ajax.Updater(
   $('ajaxinfodiv'),
   'ajaxlekerdezo.php', 
   {
      method:'get',
      onComplete:leKerdezesKesz('góranga','harihari')
   });

Sajnálatos módon azt fogjuk tapasztalni, hogy az onComplete-hez kapcsolt leKerdezesKesz() függvényünk nem akkor hívódik meg amikor az Ajax.Updater befejezi a futását, és feltölti a válaszként érkezett adatokkal az ajaxinfodiv id-jű html elemünket, hanem ez előtt. Namásmost, ha történetesen a leKerdezesKesz() történetesen pont ezzel a html elemmel akar dolgozni (pl átszínezi, villogtatja, vagy bármi), akkor nem a várt eredményt adja, mivel a html elemünk a meghívás pillanatában üres lesz, vagy ha van onLoading tulajdonságunk, akkor az azzal definiált tartalom lesz benne.

A megoldás

A megoldás egyszerű, a prototype onComplete kezelésének mögöttes és szövevényes megoldásából adódik 🙂 Ha az onComplete tulajdonságnak egy anonim függvényt adunk meg, akkor az már ténylegesen akkor fog lefutni amikor azt akartuk.

new Ajax.Updater(
   $('ajaxinfodiv'),
   'ajaxlekerdezo.php', 
   {
      method:'get',
      onComplete:function(){
         leKerdezesKesz('góranga','harihari');
         }
   });

One thought on “Paraméter átadás – Ajax és OnComplete

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.