Ako aplikovať observer ak je použitá metóda setFormValues (Dojo)
Jednou z negatívnych vlastností Dojox form managera je skutočnosť, že ak sa použije metóda setFormValues(), zmena hodnôt v poliach formulára zároveň spustí aj observer. Zo začiatku jednoduchý problém, ktorý je možné ošetriť podmienkou, no v skutočnosti ide o zložitejší jav, ako sa na prvý pohľad môže zdať.Metóda setFormValues() spúšťa observer, ktorý spúšťa v prehliadači asynchrónne eventy. Akákoľvek premenná, ktorá by riadila funkciu observera, bude platná skôr, ako skončia eventy v internetovom prehliadači. Jednou z alternatív, ktorú je možné aplikovať na funkciu observera, je ignorovať počet volaní observera, ktorý sa rovná počtu jeho volaní - počtu polí so zápisom data-dojo-observer="observerFunction" vo form manageri. To ale znamená, že pri každej zmene počtu elementov formulára so zápisom data-dojo-observer="observerFunction" je potrebné meniť aj číslo s počtom volaní. Druhou alternatívou je aktivovať riadiacu premennú s časovým oneskorením, ktoré je dlhšie ako čas eventov, napr. 300 ms. A práve druhej alternatíve je venovaný tento príspevok. Na nasledujúcom príklade je demonštrovaný predstavený problém.Príklad: Metóda setFormValues() spustí observer.
V ďalšom príklade je uvedený klasický synchrónny spôsob možného riešenia problému, ktorý je ale neúčinný, keďže eventy sú asynchrónne.Príklad: Bežné aplikovanie podmienky, ktoré je neúčinné.
Pre zamedzenie problému s observerom si vytvoríme funkciu, ktorá signalizuje, že hodnoty formulára už boli nastavené a observer je pripravený na svoju činnosť. Funkcia s názvom enableObserver() sa spúšťa cez časovač setTimeout() s nastavením na 300ms. Tento čas by mal byť dostatočný na ukončenie asynchrónnych udalostí, ktoré spustí metóda setFormValues(), resp. observer. Vlastnosťou formValuesUpdated povolujeme observeru jeho činnosť. Pokiaľ vlastnosť neexistuje alebo bude mať hodnotu false, obsah funkcie observera bude neaktívny. Príklad: Zamedzenie spustenia observera pri metóde setFormValues().
Teraz by už funkcia observera mala reagovať len na zmenu v poli formulára. Pre zamedzenie problémov so scopom, je potrebné aplikovať na funkciu setTimeout() metódu hitch().
V prípade, že máte ďalšie zaujímavé riešenie ako uvedený problém odstrániť, podeľte sa oň prostredníctvom komentára.27.8.2013 (aktualizované 9.9.2013), Matej LednárKategória: DojoDojo,programovanie,JavaScript,dojo,dojox/form/Manager,observer,intermediateChanges,setFormValues,dijit/registry,dojo/_base/langŽiadna časť tohto článku nesmie byť reprodukovaná bez uvedenia autora a URL na túto stránku.Viac informácií nájdete v sekcii O projekte.
Komentáre
Pong06.11.201404:14hello, I'm sorry that I can't read your language. Are you talking this bugs in dojox???
https://bugs.dojotoolkit.org/ticket/18356Autor16.11.201418:06Thanks for comment
This problem should fix watch property. But it overrides watch() method and doesn't work.
http://dojotoolkit.org/reference-guide/1.10/dojox/form/manager/_Mixin.html#id5