Na tomto a ďalších cvičeniach budete pracovať na druhom zadaní - webovej aplikácii dynamického blogu. Váš blog bude jednostránkovou aplikáciou (single page application, SPA) s jediným HTML súborom (index.html). Navigáciu bude zabezpečovať smerovač na strane klienta (client side router), ktorý bude využívať časť url nazývanú fragment alebo hash (za znakom #).
Všetko si najprv vyskúšate formou tutoriálu na aplikácii, ktorá je podobná výsledku kroku 2 z cvičenia 7. Tutoriál je obsiahnutý v krokoch 1 až 3 posupu. Vznikne webová aplikácia, ktorú potom prerobíte do podoby podobnej vášmu prvému zadaniu - statickému blogu. Z prvého zadania prevezmete tému, vzhľad a názory návštevníkov. Výslednú aplikáciu rozšírite o získavanie ďalších údajov zo servera a ďalej ju budete rozširovať v nasledujúcich týždňoch.
Poznámka:
Technológie použite pri vypracovani dnešného zadania sú vysvetlene v
prednaškach: číslo 8.
Poznámka:
Toto cvičenie sa od predchádzajúcich aj nasledujúcich lýši v jednej
podstatnej veci. Kým v ostatných sú "tutoriálové" úlohy doplňujúce a môžete ich preskočiť, tu sú
dôležitou súčasťou tvorby vášho zadania. To, čo v nich vytvoríte bude tvoriť základ finálnej podoby
vášho zadania.
Úloha 1: Úloha: Oboznámte sa s parametrickým hash router-om 06hashRouterModularPaged.
Stiahnuteľná verzia router-a je dostupná v archíve 06hashRouterModularPaged.zip. Všimnite si, že router je načítavaný ako modul a jednotlivé trasy (v routes.js) majú v položke getTemplate funkciu. Funkciu preto, aby sme mohli HTML tvoriť na základe parametrov. Funkcia sa navyše stará aj o vloženie HTML do cieľového elementu (položka target). To je preto, aby sme zvládli aj spracovanie údajov získaných pomocou asynchrónnych požiadaviek zo servera.
Poznámka:
Dôsledkom načítania router-a ako modulu je, že príklad bude funkčný iba pri
spustení na serveri. Preto na experimentovanie použite vhodné IDE, napríklad WebStorm alebo VS Code s
LiveServer. To platí aj pre aplikáciu, ktorú budete vytvárať v ďalších krokoch. Ďalšou možnosťou je
vypnúť kontrolu na medzidoménove načítanie (Cross-Origin restrictions) - v prehliadači Safari na Mac OS:
Develop -> Disable Cross-Origin Restrictions, prípadne môžete vyskúšať postup zo stránky stackoverflow
pre OS Windows a prehliadač Google Chrome
Úloha 2: Úloha: Vytvorte takú verziu jednostránkovej aplikácie z kroku 2 v cvičení 7, kde bude riadenie stavu aplikácie zabezpečené hash router-om. Všetky trasy budú dostupné z hlavného menu aplikácie. Trasy budú 4:
Pri generovaní HTML využite šablónovací systém Mustache. Po úspešnom zadaní nového názoru nech sa prejde na názory návštevníkov.
Úlohu môžete riešiť samostatne alebo môžete postupovať podľa nasledujúceho kompletného postupu riešenia. Prvý krok postupu však musíte vykonať, keďže v ňom vytvoríte základ druhého projektu:
Pre ďalšie fungovanie je potrebné pracovať vo vývojovom prostredí WebStorm, ktoré bolo popísané v cvičení 1.(prípadne ine riešenie Cross-Origin Restrictions popísane v poznámke vyžšie). V prostredí WebStorm vytvorte nový projekt podľa tejto šablóny. Vytvorili ste základ druhého projektu, ktorý už obsahuje js súbory s routerom (paramHashRouter.js), trasami (routes.js), kódom pre hlavné menu (mainMenu.js) a spracovanie údajov z formulára (addOpinion.js). Skript routerInit.js inicializuje router. Funkčná je len prvá položka v menu (Welcome!).
index.html
za element
pridajte element
so šablónou pre články. routes.js
pridajte objekt
Obsah routes.js teraz bude
Teraz je funkčná aj druhá položka v menu (Articles).
Funkcia, ktorá je v položke getTemplate nového objektu iba načíta html obsah script elementu s
id=template-welcome do cieľového elementu. Cieľový element je ten s id daným argumentom targetElm,
tu je to router-view. Ak chcete vedieť ako sa router-view dostane do targetElm, preštudujte si kód
router-a, konkrétne paramHashRouter.js
index.html
za element
pridajte element
s Mustache šablónou pre názory návštevníkov.
routes.js
pridajte objekt
Na spracovanie názorov návštevníkov do HTML potrebujeme viac ako jeden riadok kódu. Aby to bolo
prehľadné, dáme tento kód do samostatnej funkcie createHtml4opinions. Túto funkciu pridáme v ďalšom
kroku. Teraz sme len v položke getTemplate objektu s príslušnou trasou (opinions) uviedli jej názov.
routes.js
pridajte funkciu
Funkčná je už aj tretia položka v menu (Visitor opinions).
index.html
za element
pridajte element
čo je HTML kód pre formulár pre nový názor. routes.js
pridajte objekt
Tým ste ukončili sfunkčnenie poslednej položky v menu. Kód na spracovanie údajov z formulára už
totiž je v súbore addOpinion.js.
Úloha 3: V trase articles nahraďte statické články za zoznam prvých maximálne 10 článkov zo servera https://wt.kpi.fei.tuke.sk/. Ku každému zobrazte názov (title) a autora (author). Na získanie článkov použite XMLHttpRequest.
Postup riešenia je nasledovný:
index.html
vymažte element:
a namiesto neho pridajte elementy
Nová šablóna template-articles slúži na zobrazenie zoznamu článkov, získaných zo servera. Šablóna
template-articles-error sa použije keď sa články získať nepodarí a to na výpis chybového hlásenia.
routes.js
zmeňte riadky
na
Podobne ako pri trase opinions, aj tu spracovanie dáme do samostatnej funkcie, konkrétne
fetchAndDisplayArticles. Túto funkciu pridáme v ďalšom kroku.
routes.js
pridajte funkciu
Funkcia fetchAndDisplayArticles získa údaje o článkoch zo servera pomocou XMLHttpRequest API,
vygeneruje z
nich HTML kód použitím Mustache šablóny a vloží ho do elementu s id vo vstupnej premennej targetElm.
Úloha 4: Aplikáciu z predchádzajúceho kroku upravte a rozšírte použitím vášho prvého projektu. Zachovajte pri tom použitie routera v plnom rozsahu.
V tejto úlohe máte s použitím toho, čo ste vytvorili v cvičeniach 1 až 7 urobiť s aplikáciou z predchádzajúceho kroku nasledujúce:
Úloha 5: V aplikácii sa teraz zobrazí iba prvých 10 článkov. Zmeňte to tak aby bolo možné zobraziť všetky články. Články nech sa zobrazujú po stránkach, kde na každej stránke (okrem poslednej) bude 20 článkov. Pomocou odkazov Previous a Next nech sa dá prejsť na stránku s predchádzajúcimi resp. nasledujúcimi (maximálne) 20 článkami. Ak sa prejsť na nasledujúce alebo predchádzajúce už nedá, príslušný odkaz nech sa nezobrazí. Prechádzanie riešte pomocou router-a a Mustache šablón. Pre komunikáciu so serverom použite XMLHttpRequest.
Poznámka: Stránkovanie s router-om vidíte v príklade 06hashRouterModularPaged ( 06hashRouterModularPaged.zip) v trase main (odkaz Main Content). Ako získať požadovaný počet článkov od požadovaného indexu (offset) zistíte z dokumentácie servera WTserverAPI (časť Parametre pre rozsah článkov).