Zpracování payload v javascriptu

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

Zdravím, mám takový primitivní dotaz, který hledám už několik dní a nenašel jsem něco, z čeho by to úplně jasné, jak se zpracovává odpověď v javascriptu.

Například:
odesílám payload

if ($this->isAjax()) {
	$this->payload->foo = $foo;
        $this->sendPayload();
}

používám doplňky Ajax s jQuery a Ajaxové formuláře pro ajaxové zpracování následovně:

$("form.ajax :submit").live("click", function () {
    $(this).ajaxSubmit();
    //něco
    return false;
});

Jak zde zpracuji paylod, který si posílám z presenteru? Díky za odpovědi.

Bernard Williams
Člen | 207
+
0
-

Nazdárek,

dá se použít něco ve smyslu:

$this->payload->text = 'Ahoj světe';
$this->sendPayload();
var request = $.ajax({
	url: {plink udelejNeco!},
	type: "POST",
	data: { id : 666 }
});

request.done(function(msg) {
	alert(msg.text);
});

Konečných řešení je samozřejmě víc.

Bernard

svagi
Člen | 15
+
0
-

Díky trošku mě to nakoplo a už jsem na to příšel:

$this->payload->text = 'Ahoj světe';
$this->sendPayload();
$(this).ajaxSubmit().done(function(payload){
    alert(payload.text);
});

Editoval svagi (30. 3. 2012 11:58)

Ascaria
Člen | 187
+
0
-

Já použil https://componette.org/search/?… a pak něco jako

<script>
        $('a.ajax, a.datagrid-ajax').live('click', function(event){
            if(!event.isDefaultPrevented()){
                // Zobrazíme spinner
                $("#ajax-spinner, #ajax-spinner-bg").fadeIn('fast');//.show();
                // Načteme ajaxově stránku
                $.get(this.href);
                // Zamezíme původnímu eventu
                event.preventDefault();
                return false;
            }
        });
</script>

Jo a konec jsem doplnil o

<script>
// ...
		error: function (payload) {
            // Oznámíme chybu
            alert('AJAX Error\n\n' + payload.status + ' ' + payload.statusText);
            // Schováme spinner a jeho pozadí
            $("#ajax-spinner, #ajax-spinner-bg").hide();
		}
	}
});

jQuery.ajaxSetup({
	success: jQuery.nette.success,
	error: jQuery.nette.error,
	dataType: "json"
});
</script>

Editoval Ascaria (30. 3. 2012 12:19)

svagi
Člen | 15
+
0
-

a tím isDefaultPrevented() zabráníš opětovnému odeslání? Protože při tom mém řešení se mi požadavky pořád přičítají, takže:

  1. odeslání = 1 odpověď
  2. odeslání = 2 odpovědi

… atd.

Editoval svagi (30. 3. 2012 12:44)

Ascaria
Člen | 187
+
0
-

S tím jsem se potýkal dlouho, nakonec jsem to vyřešil ne moc elegantně takto:

<script>
        /* Confirmová tlačítka */
        $('a').die('click');
        $('a').live('click', function(event){
            // Pokud chce odkaz confirm a uživatel zruší akci, zrušíme akci
            if($(this).data('confirm') != undefined && !confirm($(this).data('confirm'))){
                // Zamezíme původnímu eventu
                event.preventDefault();
                return false;
            }
            // Pokud chce odkaz druhý confirm a uživatel zruší akci, zrušíme akci
            if($(this).data('confirm2') != undefined && !confirm($(this).data('confirm2'))){
                // Zamezíme původnímu eventu
                event.preventDefault();
                return false;
            }
            return true;
        });

        /* Ajaxová tlačítka */
        $('a.ajax, a.datagrid-ajax').die('click');
        $('a.ajax, a.datagrid-ajax').live('click', function(event){
            if(!event.isDefaultPrevented()){
                // Zobrazíme spinner
                $("#ajax-spinner, #ajax-spinner-bg").fadeIn('fast');//.show();
                // Načteme ajaxově stránku
                $.get(this.href);
                // Zamezíme původnímu eventu
                event.preventDefault();
                return false;
            }
        });
</script>

tzn eventy nejdřív zabiju a pak nastavím znovu (tím zamezím tomu, že se na tlačítko navěsí další a další a dalsí ten samý event). tu kontrolu isdefaultprevented tam mam z toho duvodu, ze potvrzovaci dialogy resim jinde, z kódu je patrno že předem. a jelikož pak má odkaz 2 eventy (confirm a ajax req, tak confirmem preventnu default (tím samozřejmě taky automaticky zamezím vykonání hrefu, ale nikoli dalšího eventu) a v ajax eventu kontroluju jestli je to prevently a pak ajax nevykonam).

Toto řešení má tu výhodu, že pak stačí dát jakémukoli odkazu „data-confirm“ a třeba = „data-confirm2“ a nemusím řešit javascript confirmu:

<a href="link nekam" data-confirm2="Opravdu chcete smazat žádost &quot;15&quot;?" data-confirm="Smazat žádost &quot;15&quot;?" class="datagrid-ajax" title="popisek tlacitka">obrazek tlacitka</span></a>

přičemž text otázky konfirmu mám samozřejmě v tom data-* attributu

Editoval Ascaria (30. 3. 2012 13:07)

svagi
Člen | 15
+
0
-

Paráda, to se může hodit. Použít primitivního die mě zrovna nenapadlo, přitom to tak v JS řeším velmi často i na jiných místech, ale v mém případě to naprosto dostačuje, jednoduše tím zamezím dalšímu navěšování eventů, přesně jak si psal. Díky moc! :-)

Editoval svagi (30. 3. 2012 13:18)