Jak správně používat payload

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

Dobrý den,
už asi dva dny si lámu hlavu s problémem jak správně používat payload v ajaxu. V presenteru má handli.

public function handleClick() {
	if ($this->isAjax()) {
		$this->payload->message = 'pokus';
		$this->sendPayload();
	}
}

jesli jsem to vše správně pochopil tak $this->payload->message = ‚pokus‘; by mi mělo poslat do javascriptu hodnotu „pokus“.

A v souboru s JavaScriptem mám.

$('.pokus').click(function () {
    $.nette.ajax({
         success: function (payload) {
            console.log(payload.message);
         }
     });
});

Kde by se mi do konzole měl vypsat pokus.

Odkaz v šabloně vypadá takto.

<a n:href="click!" class="pokus ajax">click</a>

Postupuji správně? Díky za každou odpověď.

Jan Mikeš
Člen | 771
+
0
-

Dej pryc class=„ajax“ z tveho elementu, pak by mel tvuj kod fungovat (bude potreba jeste pridat event.preventDefault() do javascriptu). Trida „ajax“ ma totiz svou vlastni implementaci a ta uz dale neprobubla (diky stopPropagation(), myslim ale ze i toto se da zmenit). Druhou moznosti je napsat si extenzi pro nette.ajax.js kde budes s payloadem pracovat.

edit: v presenteru by nemelo byt povinne sendPayload().

Editoval Lexi (25. 11. 2015 12:32)

unset
Člen | 16
+
0
-

@Lexi
Děkuji za radu. Upravil jsem následovně javascript:

$('.pokus').click(function (event) {
    event.preventDefault();
    $.nette.ajax({
         success: function (payload) {
            console.log(payload.message);
         }
     });
});

A v konzole mi vrací „undefined“ místo „pokus“ jak si definuji v handli. Nevíš prosímtě kdy by mohla být chyba? Děkuji za radu

Jan Mikeš
Člen | 771
+
0
-

Smazal jsi z presenteru sendPayload() (i kdyz to by nemelo zpusobovat prazdny payload).
Spise si zkus do console lognout celou promennou payload, namisto payload.message a napis sem vysledek.

Jan Mikeš
Člen | 771
+
+1
-

Tak jsem to rychle otestoval, a mel jsi chybu v pouziti nette.ajax.js, kterou jsem si vubec neuvedomil :-) zde je cely muj funkcni priklad:

<a class="test-link" n:href="test!">asdf</a>

<script>
$(".test-link").click(function(e){
		e.preventDefault();
		var $el = $(this);

		$.nette.ajax({
			url: $el.attr("href"),
			success: function(payload) {
				console.log(payload.value);
			}
		});
	});
</script>
	public function handleTest()
	{
		$this->payload->value = "xyz";
	}

Uprav si dle potreby ;)

unset
Člen | 16
+
0
-

@Lexi
Tak já už nevím kde bych mohl mít chybu použiju přesně kod co jsi poslal a stále mám „undefined“ :(

Jan Mikeš
Člen | 771
+
0
-

A pouzivas tento https://github.com/…ette.ajax.js balicek na ajax?
Vyzkousej si to na cistem sandboxu, tim eliminujes chybu „okolniho vlivu“.

Editoval Lexi (25. 11. 2015 23:05)

unset
Člen | 16
+
0
-

@Lexi Ano používám nette.ajax.js. Zkoušel jsem to i na čistém sandboxu a pořád nic :(

Jan Mikeš
Člen | 771
+
0
-

Nahod ten sandbox nekde, zkusim se ti na to podivat.

unset
Člen | 16
+
0
-

@Lexi sandbog jsem nahrál na github díky za radu

Jan Mikeš
Člen | 771
+
0
-

@unset dival jsem se na to a na prvni pohled jedina vec co me napada:
Zkus ty scripty obalit anonymni funkci takto:

<script>
$(function(){
	$(".test-link").click(function(e){
        e.preventDefault();
        var $el = $(this);
        $.nette.ajax({
            url: $el.attr("href"),
            success: function(payload) {
                console.log(payload.value);
            }
        });
    });
});
</script>

Pokud nepomuze tak si to zitra forknu a najdu ti chybu ;)

Editoval Lexi (27. 11. 2015 21:14)

enumag
Člen | 2118
+
0
-

@Lexi Ten skript je přímo v template a až za tím linkem takže ten selektor by měl fungovat. V tomhle problém nebude.

Editoval enumag (27. 11. 2015 23:08)

jiri.pudil
Nette Blogger | 1029
+
+2
-

To $this->sendPayload() tam v tomhle případě být musí. Pokud tím neukončíš životní cyklus presenteru už v té handle metodě, pojede normálně dál a protože neinvaliduješ žádný snippet, pošle ti místo payloadu zpátky celou šablonu.

unset
Člen | 16
+
0
-

Diky všem už mi to funguje správně, jen bych se chtěl ještě zeptat jestli postupuji správně když jsem upravil handli takto:

if($this->presenter->isAjax()) {
	$this->presenter->payload->message = 'success';
	$this->presenter->sendPayload();
	$this->redrawControl('test');
} else {
	$this->presenter->redirect('this');
}

když jsi chci odeslat payload a zárověň přepsat snippet. Mě se totiž do konzole nezapíše hodnota v payload. Děkiji za radu