Az 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'); } });
Köszönet a leírásért ! 🙂
Hasznos volt számomra.
Üdv. Laci