Ajax po druhé se neodešle

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lukas.jenicek
Člen | 15
+
0
-

Dobrý den
měl bych dotaz ohledě ajaxu v templatu mám tenhle kód

<?php
var data = {};

    $(document).on('submit', 'form.ajax', function (event){
        Ajax.search
        (
            {link filterParcels!},
            {"{!$control->name}-data": $(this).serialize()}, // data
            function(){
            }
        );
    	event.preventDefault();
    });

var Ajax = Ajax || (function(){

    return {
        search: function(link, data, callback) {
            $.nette.ajax({
                url: link,
                data: data,
                success: function(payload) {
                    typeof callback === 'function' && callback(payload);
                }
            });
        }
    };

}());
?>

a po odeslání hodnot ajaxem vše funguje, ale jakmile submitnu formulář po druhé tak se neodesílá ajaxem. První ajax vrací normálně 200 OK a vše je v pořádku.
Předem díky za jakoukoliv radu !

lukas.jenicek
Člen | 15
+
0
-

Tak jo zjistil jsem, že při první submitu to pošle na správný link, ale na druhym kliknutí se sice formulář posíla znovu ajaxem, ale uplně na jiný link a s jiným formátem DAT. Nejspíš je zatím určitá konfigurace $.nette.ajax, ale moc této knihovně nerozumím. Nemohl by někdo poradit ?

Šaman
Člen | 2659
+
0
-

AJAX is dark and full of terrors!

Rovnou varuju, že následující stať pravděpodobně nepřinese řešení tvého problému. Ale třeba tě potěší, že v tom nejsi sám :)

Myslel jsem, že mám stejný problém, poprvé v pohodě a napodruhé ajax nefungoval. Pak jsem zjistil, že ajaxově resetuji Form včetně hidden pole, které je potřeba pro správné zařazení záznamu. Takže to spadlo na dotazu do databáze a „nefungovalo to“. To jsem opravil, ale stále mi ve výpisu chyběl poslední přidaný záznam. Po jakémkoliv (i ajaxovém) refreši se objevil, v databázi byl, ale při requestu, ve kterém se přidal, se mi při následném redrawnutí neobjevil. Nakonec jsem zjistil, že redrawuji v actionList($id), protože jsem potřeboval znát $id ještě před vytvořením komponent. A protože neexistovala metoda renderList(), tak se mi spustila action, nastavila $id, překreslila a teprve potom se mi v továrničce vytvořila komponenta, která už samozřejmě obsahovala i poslední záznam. Ta se ale už nevykreslila. Stačilo přidat prázdnou renderList(), ani nebylo potřeba v ní redrawovat.
Ještě předtím jsem zjistil, že ajax nemá rád parametry komponent render($param), ani pohledy komponent {control foo:list}. Ajax totiž při překreslování komponenty zavolá prostě metodu render, bez parametru.

Proč to sem píšu, když to s tvým problémem asi moc nesouvisí? Protože AJAX is dark and full of terrors. Zkus to zjednodušit co nejvíc, zkus překreslovat snippety i s komponentama z presenteru (pokud ti nefunguje překreslování vnitřních snippetů komponent), zkus omezit parametry render metod, je pravděpodobnější, že problém je u tebe, než v knihovně, kterou už dlouho používá spousta lidí.

P.S. Jo a to jsem se vůbec nevrtal do vlastních skriptů, jen jsem přilinkoval nette.ajax.js a snažil se rozchodit poměrně základní funkcionalitu. Práce na dvě noci, ale už to šlape. :D

Editoval Šaman (24. 7. 2014 17:44)

lukas.jenicek
Člen | 15
+
0
-

Tak aspoň v tom nejsem sám :D .. Ten problém jsem vyřešil asi ne nejlepším způsobem nebo spíš s Nette dělám teprve asi měsíc a půl a posílal jsem takhle ajaxy pořád a asi na tom nic měnit nebudu … Udělal jsem to klasickým jquery bez NETTE.AJAX.JS.

<?php
// SEARCH FILTER FORM
$(document).on('submit', 'form.ajax', function(event){
   data = $(this).serializeJSON();
   Ajax.search
   (
        {link filterParcels!},
        {"{!$control->name}-condition": data}, // data
        function(payload){
            $('#snippet-parcelsList-parcelsForm').html(payload.snippets['snippet-parcelsList-parcelsForm']);
        }
   );
   event.preventDefault();
});
?>

Možná později přepíšu, ale potřeboval jsem to co nejrychleji napsat a když to funguje tak to asi ničemu nevadí.