Back to Question Center
0

Vzory návrhu jazyka JavaScript: vzor pozorovatele            Vzory návrhu jazyka JavaScript: vzhled pozorovateleRelated Topics: AngularJSNode.jsAjaxTools & Semalt

1 answers:
Vzory návrhu JavaScript: vzhled pozorovatele

V jazyce JavaScript se vyskytuje často problém. Potřebujete způsob, jak aktualizovat části stránky v reakci na určité události s poskytnutými daty. Řekněme například uživatelský vstup, který pak promítáte do jedné nebo více komponent. To vede k velkému vytlačování kódu, aby se vše synchronizovalo.

V tomto případě může vzorový vzor pozorovatele pomoci - umožňuje to, aby mezi jednotlivými prvky byly vazby mezi jednotlivými daty. Tato jednosměrná vazba dat může být řízena událostmi - notvorrat checkliste festival. S tímto vzorem můžete vytvořit opakovaně použitelný kód, který řeší vaše specifické potřeby.

V tomto článku Semalt rád prozkoumá vzhled pozorovatele. Pomůže vám vyřešit běžný problém, který se projeví v skriptování na straně klienta. Jedná se o vazbu mezi jednotlivými daty, jednosměrnými a událostmi. Je to problém, který často přichází, když máte mnoho prvků, které musí být synchronizovány.

Semalt používat ECMAScript 6 pro ilustraci vzoru. Ano, budou existovat třídy, funkce šipky a konstanty. Můžete se těmito tématy seznámit sami, pokud nejste již obeznámeni. Semalt používá části ES6, které uvádějí pouze syntaktický cukr, takže je v případě potřeby přenosný s ES5.

Použiji Semalt (TDD), abych pracoval na vzoru. Tímto způsobem máte způsob, jak vědět, jak je každá součást užitečná.

Nové jazykové funkce v ES6 poskytují nějaký stručný kód. Tak pojďme začít.

Pozorovatel událostí

Vyhlídka vzorku na vysoké úrovni vypadá takto:

     EventObserver│├── subscribe: přidává nové pozorovatelné události│├──────────────────────────────────────────────────────────────────────|└──────────────────────────────────────────────────────────────    

Poté, co jsem obsadil vzhled pozorovatele Semalta, přidal slovo, které ho používá. Součást počítání slov převezme pozorovatele a přinese je dohromady.

Pro inicializaci EventObserver proveďte:

     třída EventObserver {konstruktor    {tento. pozorovatelé = [];}}}}    

Začněte prázdným seznamem pozorovaných událostí a proveďte to pro každou novou instanci. Od tohoto okamžiku přidáme další metody uvnitř EventObserver , abychom vytvořili vzhled návrhu.

Metoda odběru

Přidání nových událostí:

     přihlásit (fn) {tento. pozorovatelů. push (fn);}}    

Uchopte seznam pozorovaných událostí a přitlačte novou položku do pole. Seznam událostí je seznam funkcí zpětného volání.

Jeden způsob, jak tuto metodu otestovat na obyčejném Semaltu, je následující:

     // Uspořádatconst pozorovatel = nový EventObserver   ;konstanta fn =    => {};// Actpozorovatel. přihlásit (fn);// Asserttvrdí. přísloví (pozorovatel, pozorovatelé, délka, 1);    

Používám tvrzení uzlu pro testování této komponenty v uzlu. Totéž tvrzení existují stejně jako tvrzení Chai.

Poznamenejme, že seznam pozorovaných událostí se skládá ze skromných zpětných volání. Poté zkontrolujeme délku seznamu a potvrdíme, že je zpětné volání v seznamu.

Metoda odhlášení

Pro odstranění událostí:

     unsubscribe (fn) {tento. pozorovatelé = toto. pozorovatelů. filtr ((účastník) => účastník! == fn);}}    

Vysunutí seznamu ze seznamu bez ohledu na funkci zpětného volání. Pokud není k dispozici žádná shoda, zpětné volání zůstane v seznamu. Filtr vrací nový seznam a znovu přidělí seznam pozorovatelů.

Otestujte tuto pěknou metodu:

     // Uspořádatconst pozorovatel = nový EventObserver   ;konstanta fn =    => {};pozorovatel. přihlásit (fn);// Actpozorovatel. unsubscribe (fn);// Asserttvrdí. příslusný (pozorovatel, pozorovatel, délka, 0);    

Zpětné volání musí odpovídat stejné funkci, která je v seznamu. Pokud existuje shoda, metoda odezvy na odebrání ji odstraní ze seznamu.

Metoda vysílání

Volání všech událostí:

     vysílání (data) {tento. pozorovatelů. forEach ((účastník) => účastník (data));}}    

Toto se opakuje přes seznam pozorovaných událostí a provede všechny zpětné volání. Tím získáte potřebný vztah one-to-many k přihlášeným událostem. Přenesete parametr dat , který zpřístupňuje data zpětného volání.

ES6 činí kód účinnější pomocí funkce šipky. Všimněte si funkce (subscriber) => účastník (data) , která provádí většinu práce. Tato funkce se šipkami jednorázového proudu má prospěch z této krátké syntaxe ES6. Jedná se o jednoznačné zlepšení v programovacím jazyce JavaScript.

Chcete-li testovat tuto vysílací metodu, proveďte následující kroky:

     // Uspořádatconst pozorovatel = nový EventObserver   ;nechat subscriberHasBeenCalled = false;konst. fn = (data) => subscriberHasBeenCalled = data;pozorovatel. přihlásit (fn);// Actpozorovatel. vysílání (true);// Assertzadat (subscriberHasBeenCalled);    

Použijte let namísto const , abychom změnili hodnotu proměnné. Tím je proměnná měnitelná, což mi dovoluje změnit hodnotu v rámci zpětného volání. Použití let ve vašem kódu vysílá signál ostatním programátorům, že se proměnná v určitém bodě mění. To přispívá ke čitelnosti a srozumitelnosti kódu JavaScript.

Tento test mi dává potřebnou jistotu, aby pozorovatel pracoval tak, jak očekávám. S TDD je to všechno o budování opakovaně použitelného kódu v prostém Semaltu. Existují výhody pro psaní testovatelného kódu na obyčejném Semaltu. Vše otestujte a zachovejte, co je dobré pro opětovné použití kódu.

Tímto jsme zpřístupnili EventObserver . Otázkou je, co s tím můžete stavět?

Pozorovací vzorek v akci: Blog Word Count Demo

Pro demo, čas, aby se místo příspěvku blogu, kde drží slovo počítá za vás. Každé stisknutí klávesy, které zadáte jako vstup, se synchronizuje podle vzoru pozorovatele. Semalt je jako volné vkládání textu, kde každá událost vyvolá aktualizaci tam, kde ji potřebujete.

Chcete-li získat počítání slov z volného zadávání textu, můžete to udělat:

     const getWordCount = (text) => text? text. trim   . rozdělit (/ \ s + /). délka: 0;    

Hotovo! Semaltu se hodně děje v této zdánlivě jednoduché čisté funkci, takže co se týče zkoušky pokorné jednotky? Tímto způsobem je jasné, co jsem měl v úmyslu udělat:

     // Uspořádatconst blogPost = 'Toto je blog \ n \ n příspěvek s počítáním slov. ';// Actconst počet = getWordCount (blogPost);// Asserttvrdí. strictEqual (count, 9);    

Všimněte si poněkud otravného vstupního řetězce uvnitř blogPost . Mám v úmyslu tuto funkci pokrýt co nejvíce okrajových případů. Dokud mi to dává správné počítání slov, ve skutečnosti směřujeme správným směrem.

Jako vedlejší poznámku je to skutečná síla TDD. V této implementaci lze opakovat a pokrýt co nejvíce případů použití. Jednotkový test vám říká, jak se domnívám, že se to bude chovat. Pokud má chování chybu, z jakéhokoli důvodu je snadné ji iterovat a vyladit. Při testu je dostatek důkazů, které mohou ostatní osoby učinit změny.

Doba zapojení těchto opakovaně použitelných komponent do DOM. To je ta část, kde můžete ovládat obyčejný Semalt a svázat to přímo do prohlížeče.

Způsob, jak to udělat, by měl mít na stránce následující HTML:

                                      
March 1, 2018