Jak správně používat payload
- unset
- Člen | 16
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
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
@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
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 ;)
- Jan Mikeš
- Člen | 771
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)
- Jan Mikeš
- Člen | 771
@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)
- jiri.pudil
- Nette Blogger | 1029
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
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