Triko zdarma Triko zdarma
Spouštíme individuální výuku programování! Zaváděcí slevy 799 Kč 599 Kč/60 minut se zkušeným lektorem! Výuka osobně Praha a okolí nebo po Skype celá ČR. O termíny a slevu si pište na [email protected].
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Lekce 8 - Dokončení objektového diáře v JavaScriptu

JavaScript Objektově orientované programování Dokončení objektového diáře v JavaScriptu

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Vylepšení objektového diáře v JavaScriptu, jsme do našeho objektového diáře v JavaScriptu přidali několik dalších funkcí. Dnes budeme pokračovat v podobném duchu a aplikaci zcela dokončíme.

Změna splněnosti záznamů

Poslední tlačítko, které nám chybí, je tlačítko na splnění úkolu.

Parametrizace

Protože tlačítko na splnění úkolu bude vypadat a fungovat velmi podobně jako mazací tlačítko, nebudeme do aplikace zbytečně vkládat duplicitní kód, ale upravíme ten stávající. Vytvoříme si pomocnou metodu na vložení tlačítka k úkolu:

_pridejTlacitko(titulek, callback) {
    const button = document.createElement("button");
    button.onclick = callback;
    button.innerText = titulek;
    this.vypisElement.appendChild(button);
}

Metoda _pridejTlacitko() dělá přesně to, co jsme měli u přidání mazacího tlačítka. Titulek a obslužnou metodu tlačítka ovšem nastavuje z parametru, takže ji můžeme použít pro vložení různých tlačítek s různými titulky a funkcemi.

Místo veškerého kódu pro mazací tlačítko nyní stačí do metody vypisZaznamy() vložit jen:

this._pridejTlacitko("Smazat", () => {
    if (confirm("Opravdu si přejete odstranit úkol?")) {
        this.zaznamy = this.zaznamy.filter(z => z !== zaznam); // Ponechá vše co není rovné proměnné zaznam
        this.ulozZaznamy();
        this.vypisZaznamy();
    }
});

Pomocnou metodu jsme si vytvořili záměrně až nyní a ne již před přidáním prvního tlačítka. To abychom si ukázali, jak se v praxi řeší situace, když potřebujete do aplikace vložit nějaký velmi podobný kód. Kód stávající vyčleníte do pomocné metody a parametrizujete jej. Prezence duplicitního kódu porušuje princip DRY, jedno z nejdůležitějších pravidel kvalitního objektového návrhu.

Privátní metody

Všimněte si, že název metody začíná na podtržítko. Pomocné metody, které by na naší třídě neměl zvenčí nikdo volat, by se měly ideálně skrýt. JavaScript v současné době bohužel neumožňuje metody rozumně zapouzdřit. Dále v kurzu si sice ukážeme, že je to možné, ale jen pomocí hacků, což kód ve výsledu znepřehlední. Označení privátních vlastností a metod pomocí podtržítka je poměrně dobrý návyk a dělá se tak často i v ostatních jazycích, které nepodporují modifikátory přístupu.

Aby byl náš kód opravdu dobře napsaný, označme si podtržítkem i metodu _nastavUdalosti(). Rovněž se jedná jen o pomocnou funkcionalitu, která by zvenčí neměla být volána.

_nastavUdalosti() {
    // ...
}

Nezapomeňte přejmenovat i volání metody v konstruktoru:

constructor(jazyk = "cs-CZ") {
    // ...
    this._nastavUdalosti();
}

Tlačítko na splnění záznamu

Po malé odbočce se vraťme zpět k novému tlačítku. To nyní vložíme pomocí připravené metody _pridejTlacitko():

this._pridejTlacitko("Označit jako " + (zaznam.splneno ? "nesplněný" : "splněný"), () => {
    zaznam.splneno = !zaznam.splneno;
    this.ulozZaznamy();
    this.vypisZaznamy();
});

Výsledek si můžete vyzkoušet :)

Ošetření vstupu

Máme tedy plně funkční diář s ukládáním do localStorage. Jediné, co nám ještě chybí, je ošetřit vstup, protože pokud uživatel nezadá datum, bude se nám vypisovat jako "Invalid Date". Upravíme si tedy metodu _nastavUdalosti() a uděláme zde jednoduchou validaci. Díky tomu, že <input type="date"> vrací value jako prázdný string, když je datum neúplné, není těžké uživatele na tento stav upozornit:

_nastavUdalosti() {
    this.potvrditButton.onclick = () => { // this zůstane nyní stále this
        if (this.datumInput.value !== "") {
            const zaznam = new Zaznam(this.nazevInput.value, this.datumInput.value);
            this.zaznamy.push(zaznam);
            this.ulozZaznamy();
            this.vypisZaznamy();
        } else
            alert("Musíte vyplnit datum!");
    };
}

Takže pokud nebude zadáno datum správně, upozorníme uživatele funkcí alert(), že ho má zadat správně, jinak nový záznam uložíme.

Design

Nyní již zbývá jen nějaký design, který si rychle prolétneme a jen minimálně upravíme v JS. Vytvoříme si v projektu složku css/, a nový soubor styly.css. Jeho obsah bude následující:

* {
    font-family: Segoe UI Light, "Calibri Light", sans-serif;
}

button {
    padding: 10px 16px;
    font-weight: 600;
    background: #2792e0;
    color: #fff;
    border: none;
    cursor: pointer;
    transition: .5s;
}

button:hover {
    background: #2954c2;
}

button:active {
    background: #204199;
}

input {
    min-width: 250px;
    padding: 8px;
    border: 1px solid #909090;
    height: 20px;
}

button, input {
    margin-top: 1rem;
    outline: none;
}

.ukol {
    width: 75%;
    padding: 2rem;
    margin: 1rem auto;
    border: 1px solid #c5c5c5;
    box-shadow: 2px 2px 4px #b1b1b1;
}

Styly nalinkujeme v index.html:

<link href="css/styly.css" rel="stylesheet">

A nyní jen lehce upravíme výpis každého záznamu:

this.vypisElement.innerHTML += `<h4>${zaznam.nazev}</h4>
    <br>úkol ${!zaznam.splneno ? "ne" : ""}splněn`;
    // ...
this.vypisElement.innerHtml = `<div class="ukol">` + this.vypisElement.innerHtml  + `</div>`;

Výsledek:

Your page
localhost

Tak a je hotovo! :) Máme tedy celkem pěkně vypadající diář, který ukládá data a lze jej reálně používat :) Pokud jste měli s čímkoli problém, pod článkem si můžete stáhnout kompletní zdrojové kódy a najít si chybu.

Příště, v lekci Učební pomůcka na OOP v JavaScriptu - Tahák, se posuneme zas dále a podíváme se na dědičnost a polymorfismus.


 

Stáhnout

Staženo 20x (4.22 kB)

 

 

Článek pro vás napsal Šimon Raichl
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje hlavně tvorbě všemožných věcí v JS
Aktivity (1)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!