Ciele
- Naučiť sa ako údaje z objektov v JavaScript-e pretransformovať do HTML pomocou šablónových literálov (template literals).
- Naučiť sa ako údaje z objektov v JavaScript-e pretransformovať do HTML pomocou šablónovacieho systému Mustache.
- Aplikovať transformáciu údajov z objektov v JavaScript-e do HTML pomocou šablónových literálov alebo Mustache do vášho blogovacieho systému (Úloha 4).
Úvod
- s použitím šablónových literálov (template literals) [9], ktoré sú priamo v jazyku JavaScript a
- s použitím šablónovacieho systému Mustache [13], [14].
Na minulom cvičení ste sa naučili ako prečítať údaje z formulára a tiež ako ich uložiť do
window.localStorage
a odtiaľ prečítať.
Dnes si vyskúšate, ako tieto údaje namiesto vypisovania do konzoly vložiť priamo do HTML kódu stránky.
Urobíte to dvoma spôsobmi:
Vyskúšate si to najprv na príklade blogu o obľúbených stromoch (My Favourite Trees) a potom vo vašom vlastnom blogovacom systéme.
Na rozdiel od predchádzajúceho cvičenia, bude váš JavaScript kód umiestnený vo viacerých samostatných skriptoch typu modul [5] a jednotlivé moduly budú vytvorené ako triedy [6].
Poznámka:
Všetko potrebné na splnenie dnešných úloh ste sa dozvedeli z prednášok 4 až 7 ([1], [2], [3], [4]).
Na podrobné oboznámenie sa s jazykom JavaScript odporúčame zdroje [7] a [8].
Ako používať knižnicu Mustache zistíte z prednášky [4], príkladov [15] a dokumentácie na [13].
S problematikou, ktorú máte dnes zvládnuť vás podrobne oboznámia aj prvé dve úlohy tohto cvičenia.
Postup
-
V príklade (aplikácii) 57myTreesFormLStorageHtml je už aplikované spracovanie údajov do HTML pomocou šablónových literálov. Podobne ako v príklade 55myTreesFormLStorageConsole.html je to však urobené len pre položky
name,createdacomment. Vy teraz doplníte spracovanie údajov do html v upravenej verzii príkladu 57myTreesFormLStorageHtml, kde je aj položkawillReturnale chýba kód na spracovanie do HTML.Úloha: V aplikácii myTreesFormLStorageHtmlWr doplňte spracovanie údajov do HTML tak, aby sa:Úlohu môžete riešiť samostatne. Komentáre-
Pri načítaní stránky všetky položky, ktoré sa z localStorage načítali do poľa
opinions, zobrazili v elementedivsid="opinionsContainer". -
Po odoslaní údajov z formulára sa nový názor (
newOpinion) nezapísal iba do poľaopinionsale pridal aj do HTML na koniec elementudivsid="opinionsContainer".
createdzobrazte iba dátum, nie čas. Na vytvorenie HTML kódu využite šablónové literály. Váš JavaScript kód píšte vo forme modulov [5], kde jednotlivé moduly sú triedami [6].//TODOv JavaScript súboroch aplikácie vám napovedia kde je aký kód potrebné vložiť. Alebo môžete použiť nasledujúci kompletný postup riešenia:
-
Stiahnite si a rozbaľte archív myTreesFormLStorageHtmlWr.zip s aplikáciou.
Ďalej budete pracovať s touto rozbalenou verziou aplikácie.
Nasledujúce kroky, okrem posledného,
budete robiť v JavaScript súbore
opinionsHandler.jss triedouOpinionsHandler, ktorý je v podpriečinkujs.
-
V konštruktore triedy komentáre
nahraďte kódom//TODO Add opinionsElm property, referencing the div with id given by the parameter opinionsListElmId //TODO Add opinionsFrmElm property, referencing the form with id given by the parameter opinionsFormElmId
Urobili sme to, aby sme príslušné elementy nemuseli opätovne vyhľadávať v DOM. Ušetríme tak čas aj energiu zariadenia na ktorom bude aplikácia zobrazená.this.opinionsElm = document.getElementById(opinionsListElmId); this.opinionsFrmElm = document.getElementById("opnFrm");
-
Vo funkcii (metóde)
opinion2htmlnahraďte komentár
kódom//TODO finish opinion2html
Tu je využitý šablónový literálconst opinionTemplate= ` <section> <h3>${opinion.name} <i>(${(new Date(opinion.created)).toDateString()})</i></h3> <p>${opinion.comment}</p> <p>${opinion.willReturn?"I will return to this page.":"Sorry, one visit was enough."}</p> </section>`; return opinionTemplate;opinionTemplatena vyrobenie HTML kódu z údajov v objekteopinion. Všimnite si, že v šablónových literáloch môžeme používať aj zložitejšie výrazy ako len názvy premenných alebo ich vlastností (položiek). Na spracovanie vlastnostiwillReturnsme využili ternárny operátor.
-
Vo funkcii (metóde)
opinionArray2htmlnahraďte komentár
kódom//TODO finish opinionArray2html
Tento kód vygeneruje HTML so všetkými názormi z poľareturn sourceData.reduce((htmlWithOpinions,opn) => htmlWithOpinions+ this.opinion2html(opn),"");sourceData(Pri jej volaní ako parameter použijeme poleopinions).
Poznámka: Funkcia
opinionArray2htmlvyužíva funkciuArray.prototype.reduce. Ak sa vám táto zdá príliš zložitá na pochopenie, tu je jednoduchšia verzia kóduopinionArray2html, ktorá používa príkaz cyklufor...of:let htmlWithOpinions=""; for(const opn of sourceData){ htmlWithOpinions += this.opinion2html(opn); } return htmlWithOpinions; -
Vo funkcii (metóde)
initkomentár
nahraďte kódom//TODO render opinions to html
Takto sa obsah poľathis.opinionsElm.innerHTML = this.opinionArray2html(this.opinions);opinions, ktorý funkciaopinionArray2htmlspracovala do HTML, dostane do elementuopinionsElm(div). Tento kód sa vykoná pri načítaní stránky (aplikácie) v prehliadači.
-
Komentár
vo funkcii//TODO add the new opinion to HTMLprocessOpnFrmDatanahraďte kódom
Tým sa práve spracovaný názor (zthis.opinionsElm.innerHTML+=this.opinion2html(newOpinion);opinion) dostane do HTML na koniec elementuopinionsElm.
-
v JavaScript súbore
myTreesFormLStorageHtmlWr.jskomentár
nahraďte kódom//TODO create the object window.opnsHndlr of the class OpinionsHandler and run its init method
Takto vytvoríte a inicializujete objektwindow.opnsHndlr = new OpinionsHandler("opnFrm","opinionsContainer"); window.opnsHndlr.init();opnsHndlrtriedyOpinionsHandler, prepojený na príslušné html elementy.
-
Pri načítaní stránky všetky položky, ktoré sa z localStorage načítali do poľa
-
Teraz výsledok predchádzajúcej úlohy upravíte tak, aby bola namiesto šablónového literálu použitá šablóna systému Mustache. Využijeme pri tom aj dedičnosť tried.Úloha: V priečinkuÚlohu môžete riešiť samostatne, podľa príkladu 66myTreesFormLStorageMstch (stiahnuteľná verzia: 66myTreesFormLStorageMstch.zip). Alebo môžete použiť nasledujúci kompletný postup riešenia:
jsvytvorte JavaScript modulopinionsHandlerMustache.jss triedouOpinionsHandlerMustache, ktorá je potomkom triedyOpinionsHandlera líši sa od nej v tom, že namiesto šablónového literálu používa šablónu systému Mustache. Mustache šablónu vložte ako nový element domyTreesFormLStorageHtmlWr.html. SkriptmyTreesFormLStorageHtmlWr.jsupravte tak, aby použil objekt triedyOpinionsHandlerMustachenamiestoOpinionsHandler.
-
Do súboru
57myTreesFormLStorageHtmlWr.htmldoplňte nový element<script id="mTmplOneOpinion" type="text/template"> <section> <h3>{{name}} <i>{{createdDate}}</i></h3> <p>{{comment}}</p> <p>{{willReturnMessage}}</p> </section> </script>Nie je dôležité, kde presne ho vložíte. Môžete ho dať napríklad pred element
script, ktorý ste vložili v predchádzajúcom kroku.Tento nový element obsahuje Mustache šablónu pre zobrazenie názoru. V šablóne sú dve vlastnosti (položky), ktoré sa v objektoch nenachádzajú. Sú to
createdDateawillReturnMessage. Je to preto, lebo hodnoty z položiekcreatedawillReturn, ktoré v objekte sú, nechceme zobraziť priamo ale až po spracovaní. Keďže Mustache šablóny sú bez logiky (logic-less), takéto spracovanie priamo v šablóne neumožňujú. Musíme ho teda urobiť predtým a spracované údaje do objektu pridať. Možno sa vám to zdá obmedzujúce, no autori Mustache takto chceli zabrániť tomu, aby sa do ich šablón dostali príkazy programovacieho jazyka.
-
V priečinku
jsvytvorte JavaScript modulopinionsHandlerMustache.jsa vložte doň kód
Táto trieda funguje rovnako akoimport OpinionsHandler from "./opinionsHandler.js"; import Mustache from "./mustache.js"; export default class OpinionsHandlerMustache extends OpinionsHandler{ constructor(opinionsFormElmId, opinionsListElmId,templateElmId) { //call the constructor from the superclass: super(opinionsFormElmId, opinionsListElmId); //get the template: this.mustacheTemplate=document.getElementById(templateElmId).innerHTML; } opinion2html(opinion){ //in the case of Mustache, we must prepare data beforehand: opinion.createdDate=(new Date(opinion.created)).toDateString(); //use the Mustache: const htmlWOp = Mustache.render(this.mustacheTemplate,opinion); //delete the createdDate item as we created it only for the template rendering: delete(opinion.createdDate); //return the rendered HTML: return htmlWOp; } }OpinionsHandler, no namiesto šablónového literálu používa Mustache šablónu. Všimnite si, že do objektuopinionsme pred použitím šablóny pridali vlastnosticreatedDateawillReturnMessage. Po jej použití sme ich odstránili. Súbormustache.js, ktorý sa v priečinkujsuž nachádza, jemustache.mjsstiahnutý zo stránky [14] a premenovaný namustache.js.Poznámka: V mnohých prípadoch je považované za bezpečnejšie namiesto modifikácie pôvodných údajov vytvoriť nové údaje, určené iba pre zobrazenie. Tento spôsob ochráni pôvodné údaje pred nechcenou modifikáciou. Na druhej strane je však zdĺhavejší a vyžaduje viac pamäte. Ak chcete aplikovať tento spôsob, použite pre funkciu
opinion2htmlnasledujúci kód:const opinionView ={ name: opinion.name, comment: opinion.comment, createdDate: (new Date(opinion.created)).toDateString(), willReturnMessage: opinion.willReturn?"I will return to this page.":"Sorry, one visit was enough." }; return Mustache.render(this.mustacheTemplate,opinionView);
-
v JavaScript súbore
myTreesFormLStorageHtmlWr.jsriadky
nahraďte kódomimport OpinionsHandler from "./opinionsHandler.js"; window.drMenuCntrl = new DropdownMenuControl("menuIts", "menuTitle", "mnShow"); window.opnsHndlr = new OpinionsHandler("opnFrm","opinionsContainer"); window.opnsHndlr.init();import OpinionsHandlerMustache from "./opinionsHandlerMustache.js"; window.drMenuCntrl = new DropdownMenuControl("menuIts", "menuTitle", "mnShow"); window.opnsHndlr = new OpinionsHandlerMustache("opnFrm","opinionsContainer","mTmplOneOpinion"); window.opnsHndlr.init();
-
Do súboru
-
Keďže už viete, ako údaje z objektov v JavaScript dostať do HTML, môžete túto funkcionalitu implementovať aj do vášho blogu, ktorý vytvárate ako zadanie z tohto predmetu.Úloha: HTML a JavaScript kód úvodnej stránky vášho blogu rozšírte tak, aby sa údaje o názoroch návštevníkov vášho blogu zobrazovali aj priamo na jeho úvodnej stránke, v na to určenom HTML elemente. Na vytváranie HTML použite šablónové literály (template literals) alebo šablónovací systém Mustache.Úlohou je vlastne váš blog, ktorý je po minulom cvičení na úrovni príkladu 55myTreesFormLStorageConsole pozdvihnúť na úroveň príkladu 57myTreesFormLStorageHtml alebo príkladu 66myTreesFormLStorageMstch.
Použite objektovo-orientovaný prístup a triedyOpinionsHandleraOpinionsHandlerMustache, uložené v samostatných moduloch v adresárijs, tak ako v predchádzajúcich úlohách.
Všetky položky uložených názorov majú byť zobrazené na stránke a to vhodnou formou.Poznámka: Keď použijete Mustache, môžete získať viac bodov ako za použitie šablónových literálov. (podrobnosti zistíte v popise k nasledujúcemu cvičeniu).
Zdroje
- Prednáška 4.
- Prednáška 5.
- Prednáška 6.
- Prednáška 7.
- JavaScript modules at MDN web docs (tutorials and reference), https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules.
- JavaScript classes at MDN web docs (tutorials and reference), https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes.
- JavaScript at MDN web docs (tutorials and reference), https://developer.mozilla.org/en-US/docs/Web/JavaScript.
- The Modern JavaScript Tutorial, https://javascript.info/.
- Template literals at MDN web docs, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals.
- Client-side form validation at MDN web docs, https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation.
- Detecting device orientation at MDN web docs, https://developer.mozilla.org/en-US/docs/Web/API/Detecting_device_orientation#Orientation_example.
- Pete LePage: Device Orientation and Motion, https://developers.google.com/web/fundamentals/native-hardware/device-orientation/.
- Mustache Manual, https://mustache.github.io/mustache.5.html.
- JavaScript knižnica pre Mustache, https://github.com/janl/mustache.js.
- Príklady k Mustache, https://hron.fei.tuke.sk/~korecko/WT/06JsMustchSpa/.
- Device orientation and motion demo, https://hron.fei.tuke.sk/~korecko/WT/05JsZaklady/58devMotionOrientation.html.
- Stiahnuteľné verzie vybraných príkladov k prednáškam, https://hron.fei.tuke.sk/~korecko/WT/Downloads/.
Doplňujúce úlohy
-
Nové tlačidlo by sme dali za element
divsid="opinionsContainer". -
Do JavaScript funkcie, ktorá sa zavolá pri stlačení tlačidla by sme dali kód, ktorý:
-
Vymaže z poľa
opinionsvšetky objekty s názormi staršími ako deň. Ako zistiť ktoré sú staršie ako deň vám napovie nasledujúci výraz
ktorý vypočíta rozdiel medzi terajším dátumom a časom a dátumom a časom vytvorenia prvého názoru v poliDate.now() - new Date(opinions[0].created);opinionsv milisekundách. -
Uloží pole
opinionsdolocalStorage.myTreesComments. -
Znova vytvorí obsah
divsid="opinionsContainer"podľaopinions.
-
Vymaže z poľa
localStorage, príslušného JavaScript objektu aj HTML kódu.
Poznámka: Ak by sme toto chceli implementovať do výslednej podoby aplikácie 57myTreesFormLStorageHtmlWr alebo do príkladu 66myTreesFormLStorageMstch, postupovali by sme nasledovne:
window.alert().
Používanie modálnych dialógových okien ale nie je vhodné, používateľa je potrebné upozorniť inak.
Zistite ako a implementujte to do JavaScript časti validácie formulára vo vašum blogu.
Poznámka: Niečo o tom ako používateľa upozorniť sa dozviete na konci článku [10].
sensorApp.html s jednoduchou web aplikáciou využívajúcou udalosti senzorov pohybu.
Môže ísť o hru alebo vhodnú vizualizáciu údajov zo senzorov.
Poznámka: Udalosti senzorov boli na prednáške [3], Príklad ich použitia nájdete na [16]. Viac sa o nich dočítate aj v článkoch [11], [12].