AJAX navigace, HTML5 History API

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

Zdravím!

Před delší dobou se tu vedla diskuse o ajaxové navigaci v rámci stránky. Původně ještě s použitím hash query stringu, snad to bylo i v roadmapě ale David se po zkušenostech s Twitterem a jeho implementací rozhodl od toho ustoupit.

Přesto se ptám – je tu někdo kdo tuhle navigaci (ideálně přes history API, query string není nic moc) implementoval v současném Nette a podělil by se?

Případně máte nějaké tipy jak to efektivně implementovat, nějaká ponaučení nebo naopak důvody proč to nedělat?

JakubJarabica
Gold Partner | 184
+
0
-

Ahoj, jednoduché demo tu: http://hokejbalzirafa.sportvin.sk/…611/diskusia – skús sa ponavigovať v tých taboch a potom naspäť. Je tam implementované pushState a popState bez akéhokoľvek fallbacku v browseroch, ktoré to nevedia. Je to v starých skriptoch od Honzy Marka, takže tam máš radšej len inšpiráciu ako to vyzerá, kód by som nekukal :)

Tu: https://github.com/…ette.ajax.js keď sa dorobí popState, tak to bude úplne tip-top.

Ešte si treba dať pozor na to, že treba pomocou jQuery.ajaxSetup nastaviť pre všetky ajaxové requesty cache:false aby ti pri klikaní naspäť prehliadač nezobrazil JSON výstup v prehliadači.

na1k
Člen | 288
+
0
-

Vypadá a funguje to pěkně, něco takového bych rád, jen budu mít ve snippetu celý obsahový blok stránky.

Vnitřně to ale implementuješ jak?

Já se teď po půlroční pauze vracím k Nette a PHP takže mám možná trochu mezery, ale co si pamatuju, tak ajax request jde používat vždy jen v rámci jednoho presenteru.
Takže máš jeden presenter (nebo u tebe spíš komponentu) s hromadou handleXY které suplují akce?


Jelikož bude u mého webu obsahová část spíš menší a méně podstatná, měl jsem v plánu ji převést celou do ajaxu (hlavní prvek stránky je mapa, kterou nechci neustále reloadovat). Obsah ale pokrývá několik presenterů a ty by se mi tímhle smrskly do jednoho byla by to neudržovatelná hromada šrotu, která by při troše štěstí snad i fungovala.

Jak to tedy řešit, pokud nějak? Nedal by se nějak zneužít router, aby z ajax requestu vyrobil normální request, který by prošel přes všechny klasické mechanismy s tím rozdílem, že by se při odeslání nevytvořila úplná response, ale ajaxová?
(Tím že by existovaly klasické presentery reagující pomocí akcí a ne handle by se současně zachovala kompatibilita pro neajaxí requesty.)

Do vnitřností Nette tolik nevidím. Mohlo by to fungovat anebo je to úplný nesmysl?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Řešil bych to asi tak, že do beforeRender() bych dal kontrolu na Ajax a invalidoval nějaký snippet content, který by měl asi stejný stejný rozsah jako blok content obvykle mívá. Samotný AJAX signály/akce nijak nerozlišuje.

na1k
Člen | 288
+
0
-

vojtech.dobes, díky, funguje to zdá se dobře :-)

A taky převelice děkuju za nette.ajax.js ;-)