.. _tutor/pagina/put_fire_delay: Put, Fire e Delay ================= Abbiamo visto precedentemente che mettendo un valore in un path possiamo attivare un dataController o un dataFormula. Questo avviene perchè al **variare** del contenuto di una locazione dello store tutti i sourceNode che hanno dei parameteri con '^' vengono informati del cambiamento e possono reagire di conseguenza. Parliamo di **cambiamento** di dati. Questo significa che mettendo un valore già presente in una locazione, non viene attivato nessun trigger. Negli esempi che seguono ci proponiamo di creare un bottone che deve incrememtare un contatore. Viene quindi preparato un dataController che sarà attivato al variare del contenuto della locazione '.flag'. .. raw:: html
Esempio di SET
Nell' esempio vediamo nella prima riga il bottone 'Increase counter' che mette il valore ``true`` nella locazione ``'.flag'`` con lo scopo di far scattare il dataController che incrementa il contatore. Se premiamo più volte questo bottone il contatore non si incrementa perchè non esiste nessun cambiamento di valore in '.flag'. Nella seconda riga abbiamo aggiunto un bottone 'Reset Flag' che va a settare il valore ``false`` in modo di poter nuovamente usare il bottone 'Increase counter'. Quindi dobbiamo premere prima uno e poi l'altro bottone perchè il controller rilevi il cambiamento. Notiamo però che il dataController viene chiamato anche per il reset e quindi il contatore si incrementa anche in questa fase. Per ripristinare un funzionamento corretto siamo costretti, quindi, nella terza riga ad aggiungere un test sul valore del flag e procedere all'incremento solo se il valore è ``true`` . PUT --- Il macro comando PUT mette un valore in una locazione dello store ma impedisce l'esecuzione dei trigger. Con questa macro, di fatto, aggiriamo il sistema dei trigger e quindi suggeriamo di evitarne l'uso a meno di esigenze davvero particolari. .. raw:: html
Esempio con SET & PUT
Nella prima parte dell'esempio useremo il comando ``PUT`` per riportare a ``null`` il valore del flag dopo che con il comando ``SET`` lo avevamo portato al valore ``true``. Questo accorgimento fa funzionare il nostro contatore ma ci costringe sempre a resettare il flag con il bottone **Reset Flag** Nella seconda parte, appena eseguito il comando ``SET``, eseguiamo immediatamente il comando ``PUT`` in modo da resettare il valore iniziale. In questo modo il nostro contatore funziona con un bottone solo. FIRE ---- La macro ``FIRE`` consente di settare in una locazione un valore e di riportarlo immediatamente a ``null``. In pratica esegue in un unico comandio una ``SET`` e una ``PUT``. .. raw:: html
Esempio con FIRE
Nella prima parte dell'esempio, viene usata la macro ``FIRE`` che setta il valore al path desiderato ma immediatamente rimette il valore a ``null``. Il nostro esempio funziona quindi con la minima fatica. Il comando FIRE è così usato che ne è ammessa anche una versione 'rapida' che non richiede di indicare un valore. Il default è ``true``. Scrivere quindi "FIRE .alfa.beta = true" o "FIRE .alfa.beta" è perfettamente uguale. La seconda parte dell'esempio mostra quindi questa sintassi. Il widget Button usa molto spesso il comando FIRE e quindi, invece di usare action e scrivere FIRE, è ammesso il parametro fire='path'. Delay ----- Anche se non strettamente inerente all'argomento SET, PUT e FIRE, vogliamo introdurre qui un parametro che spesso è usato in vari contesti di genropy ``_delay`` Un bottone di norma si auto disabilita al click dell'utente per evitare di dare più volte inavvertitamente lo stesso comand. Se desideriamo invece gestire il numero dei click effettuati su un bottone, possiamo manualmente passare un parametro ``_delay`` che esprime in millisecondi il ritardo che diamo all'esecuzione del click. A differenza del delay automatico, non c'è in questo caso una disabilitazione ma comunque, qualunque sia il numero dei click, l'effetto è di generare una sola volta la action. Esiste comunqe la variabile ``_counter`` che viene automaticamente messa nello scope della action che ci restituisce il numero di click avvenuti. .. raw:: html
Esempio con _delay
Nella prima riga abbiamo un bottone con un ritardo molto piccolo (10ms) e che ci consente di cliccare molto rapidamente e ottenere un avanzamento del counter. Nella seconda riga invece notiamo che qualunque sia il numero dei click sul bottone il counter avanza solo dopo che abbiamo smesso di cliccare e avanza di una sola unità. Nella terza usiamo la variabile ``_counter`` per sapere il numero dei click che l'utente ha generato in modalità a 'raffica'.