Zajaxovanie celej Aplikacie

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

Zdravim Nettistov :)

S implementaciou Ajaxu v Nette som cakal az do vydanie 2 a opravenia snippetov a magie okolo nich. Zaujimalo by ma ale ako sa da zajaxovat cela aplikacia, resp mam nasledovny stav.

Mam jeden layout.latte, presenter s viacerymi render metodami a ku kazdej sablonu. V layout.latte mam jeden hlavny block content ktory je v kazdej sablone nadefinovany inak (tzn meni sa len tento). Ponuka sa preto spravit z neho snippet avsak je nejaka priamociara Nette way ako toto zajaxovanie zaniest do presenteru? Momentalne ma napada len riesenie ze pomocou handleMetod menit aktualnu akciu (a teda aj render metodu) avsak to mi pride proti myslienke komponent a toho ako je Ajax v Nette zaimplementovany.

Nejake napady na riesenie?

Semik
Backer | 135
+
0
-

Myslím, že řešení (spíš výsledek) je závěr Davidovi přednášky na posledním WebExpu :-)

JakubJarabica
Gold Partner | 184
+
0
-

@westrem: Nie som si istý, či rozumiem logike pomocou handle metód meniť aktuálnu akciu.

Ak sa bavíme len o jednom presenteri, tam zajaxovanie nie je problém. Robil som to presne ako píšeš – block #content som obalil do snippetu a v beforeRender daného presenteru invalidujem tento blok.

Vysvetlím lepšie asi na príklade: http://extraligaflorbal.sportvin.sk/…n/zapas/2757 – toto je default akcia. To vodorovné „tabbed“ menu pod H1tkou sú odkazy v rámci jednotlivých akcií presenteru. Je na to navesená akurát class=„ajax“ a invaliduje sa to samo. Vždy sa invalidujú aj drobečky(vlastný snippet) + podľa potreby aj snippet s flash messages(admin môže robiť úpravy atď).

Je to s minimálnou réžiou na strane FW, funguje tam pekne pushState(podporu pre hash v starších browseroch niekedy – keď bude čas – dorobím tiež).

Nič čistejšie a efektnejšie ma nenapadá. Ako to robiť naprieč viac presentermi(hoc spomínaš len jeden s viac akciami) som neriešil, to mi príde veľmi komplexné.

newPOPE
Člen | 648
+
0
-

@jam3son ma pravdu, jeden prezenter plus par metod je v pohode. Ako sam pises ano je cesta kde block content obalis este do snippetu a mas hotovo resp staci v napr. startup invalidovat tento snippet a vsetko funguje s/bez AJAXu.

Pokial vsak nastupuje prezenterov viac a app je komplexnejsia tak je to trochu zlozitejsie, kedze signaly (by mali zrejme menit stav view minimalne, a je mozne ich posielat len na aktualny prez…) tak si s nimi nevystacis. Tu u mna pomohol zivotny cyklus prezenteru a to to, ze actionXXX je pred handleXXX cize nemusis volat signaly ale rovno view, invalidujes snippety resp vsetko naraz ->invalidateControl() a opat vsetko fici :-). Jediny problem na ktory som narazil je posielanie suborov AJAX-om (su na to workaroundy cez iframe, ale to musis donutit NETTE aby sa spravalo ako ze je to AJAX a nie POST, no to uz je na dlhsie)

Editoval newPOPE (17. 7. 2011 10:11)

westrem
Člen | 398
+
0
-

Semik napsal(a):

Myslím, že řešení (spíš výsledek) je závěr Davidovi přednášky na posledním WebExpu :-)

To video som videl ale nemam za to, ze v current release je tato funkcia spristupnena, oprav ma ak sa mylim ;)

westrem
Člen | 398
+
0
-

chalani @JAM3SoN a @newPOPE – velka vdaka! Nejak ma proste nenapadlo, ze Ajaxovy poziadavok v Nette ma v podstate rovnaky cyklus a staci len invalidovat dany control.

Este sa spytam, akym sposobom su potom generovane odkazy? Tradicne alebo sa v sablone da vykricnikovy variant (co by bol ale signal)? Alebo fakt staci len class='ajax' a funguje to „samo“?

Semik
Backer | 135
+
0
-

westrem napsal(a):

Semik napsal(a):

Myslím, že řešení (spíš výsledek) je závěr Davidovi přednášky na posledním WebExpu :-)

To video som videl ale nemam za to, ze v current release je tato funkcia spristupnena, oprav ma ak sa mylim ;)

Řekl jsem jen, že to je řešení. Nic víc :-)

newPOPE
Člen | 648
+
0
-

Zalezi co v konkretnej situacii potrebujes.

class="ajax" tam musis mat tak ci tak, aby si bol schopny odchytit klik. a zachovat sa podla toho, cize poslat request na dany link. Existuje v addonoch JS subor ktory by mal uz vsetko riesit (nikdy som ho nepouzil :-)), podla toho co sa tam pise nahodis len classy a ficis. ;-

vela zdaru s AJAXom ;-)

Nox
Člen | 378
+
0
-

@**westrem** vykřičník je pro signály pokud vím.

Stačí class='ajax' …no… „samo“… ten .ajax je akorát o tom že to označí ke zajaxování, k čemuž se používá nějaký ten Nette AJAX JS skript, ale pokud si napíšeš něco svého tak to taky jde. Udělá to to, že místo přejití na stránku to pošle AJAX request na stejnou adresu (+ je tam navěšený Nette success handler co vymění obsah došlých snippetů, případně přesměruje)
https://componette.org/search/?…
A jinak nic potřeba není, akorát sem tam nějaká ta invalidace

westrem
Člen | 398
+
0
-

@newPOPE a @Nox – dakujem! Ten JS subor poznam a aj o potrebe .ajax som vedel len som si nebol isty ci netreba nieco ineho okrem invalidacie na strane FW robit. Este raz vdaka chalani :o)

joe
Člen | 313
+
0
-

westrem napsal(a):

len som si nebol isty ci netreba nieco ineho okrem invalidacie na strane FW robit.

To záleží na aplikaci. Pokud si přidáš k odkazům class="ajax", s použitím například toho skriptu pro jQuery v doplňcích je zAJAXuješ, to ale neznamená, že všechno je tak, jak by mělo být.

Ne při každém AJAXovém požadavku potřebuješ udělat všechno to, jako při normálním požadavku. Tzn. měl bys vědět, že v případě AJAXu taháš ty data, která opravdu jen invaliduješ a využíváš, protože jinak ten AJAX je k ničemu.

22
Člen | 1478
+
0
-

Definice ze zdrojáku ala DG:

Aby nedošlo k nedorozuměním, definujme si nejdřív, co je to vlastně AJAX je. Jde o skupinu
technologií sloužících k vytváření interaktivních webových aplikací, které mohou komunikovat se
serverem bez nutnosti znovunačtení stránky.
Navzdory názvu Asynchronous JavaScript and XML se
nevyžaduje ani JavaScript, ani XML, ani asynchronnost.

…čili v praxi je AJAX prvotně určen k tomu, aby se nepřekreslovala stránka a ne aby šetřil data, což může být sporné v momentě, kdy snippet obnovuješ nějakým intervalem. Takže, kolik AJAX tahá dat a jak často na jeho užitečnost nemá vliv. Samozřejmě je lepší získavat jen taková data, které stránka potřebuje, ale to je věc programátora.

Editoval 22 (22. 7. 2011 18:20)

joe
Člen | 313
+
0
-

@22:

Pokud tady takhle každý přistupuje k AJAXu, pak jeho aplikace jsou neefektivní. To co cituješ nepopíra nic z toho, co jsem napsal. To, že je potřeba tahat jen potřebná data z toho tak trochu vyplývá. Protože k čemu provádět deset věcí, když nám v ten okamžik stačí jen jedna? Pak by implementace AJAXu na web neměla prakticky žádný smysl, protože výsledek by byl stejný, jako kdyby se stránka normálně načetla. Jen škoda, že Nette pro to nemá žádnou podporu a musí to obstarat sám programátor.

JakubJarabica
Gold Partner | 184
+
0
-

Joe: pokial k dátam pristupujes až lazy v šablóne, tak usetris na snippetoch, kt. netreba renderovat, či sa mýlim?

joe
Člen | 313
+
0
-

JAM3SoN – je to tak jak píšeš, nevýhodou je, že ti může vzniknout chyba během zpracovávání šablony. Osobně teda radši zajistím všechna data a v šabloně už je jenom vypíšu.

JakubJarabica
Gold Partner | 184
+
0
-

Chyba v šablóne ti vznike pri AJAXe a nemal by byť problém odchytiť a pekne alertnúť error. A teoreticky aj pri neAJAXovom požiadavku, to by možno nebolo zlé odchytávať do bufferu a renderovať len ak by nenastávala výnimka, inak spúšťať error presenter, čo už smrdí dosť hackovaním Nette. Určite je dosť individuálne ako to potrebuješ, aktuálna podpora v Nette mi maximálne vyhovuje a vyššia miera abstrakcie ani neviem ako by mohla fungovať.

joe
Člen | 313
+
0
-

@JAM3SoN

Trochu OT, ale dovolil jsem si využít tvůj web k popsání problému (pravděpodobně bugu v Chrome), nevím jestli sis takového chování všiml. Mimochodem tam máš tu historii trochu špatně (popsané v tom příspěvku v diskusi JPW). Kdyby někdo věděl jak to opravit … :-)

pta
Člen | 11
+
0
-

Semik napsal(a):

westrem napsal(a):

Semik napsal(a):

Myslím, že řešení (spíš výsledek) je závěr Davidovi přednášky na posledním WebExpu :-)

To video som videl ale nemam za to, ze v current release je tato funkcia spristupnena, oprav ma ak sa mylim ;)

Řekl jsem jen, že to je řešení. Nic víc :-)

Cau Semiku, tu prezentaci z WebExpa jsem videl, ale jak je na tom Nette v2.0beta teda? Da se uz neco takoveho udelat? Precejen je to bez par dnu rok od ochutnavky z WebExpa. Osobne se v nette nepoustim do ajaxu, dokud tato featura nebude funkcni nebo odvolana. Takze, jak je to? Vime/nevime?

Semik
Backer | 135
+
0
-

Rok je pro nette krátká doba a odpověď má nejspíš jen David.

Mikulas Dite
Člen | 756
+
0
-

Zajaxování je i teď hračka. Pokuď to chceš jenom tak nějak napsat, aby to fungovalo, stačí všechno ajaxové obalit v šabloně {snippet} a prakticky všude dát místo redirectu

if ($this->ajax)
	$this->invalidateControl();
else
	$this->redirect('location');

Jestli chceš posílat jenom některé snippety (což je často zbytečná optimalizace) tak stačí přidat {snippet foo} a invalidovat $this->invalidateControl('foo');.

Tohle je všechno, nic víc není potřeba – samozřejmě kromě samotného javascriptu, nette.jQuery je dobré.