Jak udělat, aby Ajax aktualizoval pouze část stránky

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

Ahoj,
začínám v Nette s Ajaxem a potřebuji, aby se mi překreslil pouze kus stránky.

Mám to v šabloně nějak takto:
Nějaký HTML kód…
potom:

{snippet payments}
 // tabulka a do ní výpis proměnných
 // ...
<a class="ajax" n:href="update!">update</a>
{/snippet}

V presenteru:
nastavím proměnné, které vypisuji v tabulce v snippetu a provedu redraw

public function handleUpdate() {
$this->template->prize_czk = '27';
$this->template->price_eur = '1';
$this->redrawControl('payments');
}

Po kliknutí na update se mi do URL přidá ‚?do=update‘ a aktualizuje se celá stránka, ne pouze snippet.
Můžete mi prosím poradit, jak dosáhnout toho, aby se znovu načetl pouze snippet?

Zax
Člen | 370
+
0
-

Máš nalinkovaný nette.ajax.js?

davez
Člen | 60
+
0
-

Jo jo, ten mám.

Zax
Člen | 370
+
0
-

Hmmm.. a voláš $.nette.init(); ? Nehlásí třeba konzole nějakou chybu?

EDIT: Možná to chce i jQuery, nebo to platí jen pro formuláře? Teď si nejsem jistý…
EDIT2: Jo, chce to předtím i jQuery..

Editoval Zax (30. 10. 2014 10:25)

davez
Člen | 60
+
0
-

Díky, trochu jsem pokročil. Nevolal jsem $.nette.init();
Teď to nic do URL negeneruje, když se podívám v Chromu do komunikace, tak ajaxový požadavek se odešle, ale stále se mi nic nepřekreslí.

Udělal jsem si teď ilustrativní případ. Zkouším to pouze takto:
šablona:

{snippet snipTest}
	{$test}
    <a class="ajax" n:href="updateIt!">update</a>
{/snippet}

presenter:

public function handleUpdateIt() {
    $this->template->test = "AJAX FUNGUJE";
    $this->invalidateControl('snipTest');
}

Defaultně je proměnná test nastavená na „Test“.
Používám invalidateControl, protože mám Nette 2.0, a dočetl jsem se, že tam se ještě redraw nepoužíval.

japlavaren
Člen | 404
+
0
-

odosle sa ajax poziadavka na server a ak ano, aka je odpoved

davez
Člen | 60
+
0
-

Response:
{„state“:[],„snippets“:{„snippet–snipTest“:" Test\n <a class=\„ajax\“ href=\„\/terminal\/www\/start\/?do=updateIt\“>update<\/a>\n"}}

besanek
Člen | 128
+
+1
-

Pozor, že pozadí zpracovávání je action*()handle*()render*(). Pokud nastavuješ to

$this->template->test = "Test";

až v render metodě tak si to přepíšeš.

akadlec
Člen | 1326
+
+1
-

V response je vidět že se ti pošle jen snippet, ale jak uvedl @besanek dojde k jeho přepsání v render metodě.

davez
Člen | 60
+
0
-

Diky!

davez
Člen | 60
+
0
-

Tak už se mi vrací přesně to, co bych chtěl zobrazit, akorát ještě neproběhne samotné zobrazení.