Zajaxovanie celej Aplikacie
- westrem
- Člen | 398
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?
- JakubJarabica
- Gold Partner | 184
@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
@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
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
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
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
@**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
- joe
- Člen | 313
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
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
@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
Joe: pokial k dátam pristupujes až lazy v šablóne, tak usetris na snippetoch, kt. netreba renderovat, či sa mýlim?
- JakubJarabica
- Gold Partner | 184
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
@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
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?
- Mikulas Dite
- Člen | 756
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é.