# Scorciatoie dello stato: INC, TOGGLE, NUL, UPDATE, UNWATCH, WAIT, BLOCKED e CACHEPATH

> Piccole funzioni che cambiano o osservano un valore dello stato tramite il suo percorso, attendono finché esiste un valore, eseguono qualcosa una sola volta per periodo e mantengono un valore dello stato nella cache.

Framework: jcomponent20
Product: jComponent 20 (jcomponent@20)
Language: it
Content-SHA256: 71ab7358e4b015c734cd9be1dac83d333a366400a6b405e2b19fdd993e2f0293
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: jcomponent20@3fedd009a277f50fddc608b97afbec553b67c51b
Review: not-recorded

Queste funzioni lavorano sullo stato di jComponent tramite **percorso** (`'user.visits'`), come `SET()` e `GET()`, e ognuna notifica i componenti e gli osservatori del percorso.

- `INC(path, [value])` somma `value` (predefinito `1`) a un numero; quando il valore è vuoto parte da `0` e quando è un testo viene prima letto come numero.
- `TOGGLE(path)` cambia un booleano (un valore vuoto diventa `true`). `NUL(path)` e il suo alias `NULL(path)` impostano il valore a `null`.
- `UPDATE(path)` (alias `UPD`) notifica tutti quelli che usano il percorso **senza cambiare il valore**: usalo dopo aver modificato un oggetto o un array sul posto.
- `UNWATCH(path, [fn])` rimuove gli osservatori del percorso creati con `WATCH()`; con `fn`, solo quello.
- `WAIT(fn or path, callback)` esegue `callback` appena la funzione restituisce qualcosa di vero, o il percorso ha un valore. Controlla subito e poi **ogni 500 ms**.
- `BLOCKED(key, timeout, [callback])` restituisce `false` la prima volta e `true` per i successivi `timeout` ms (funziona anche `'5 seconds'`): è una protezione contro un doppio clic o una richiesta ripetuta. Il `callback` viene eseguito solo quando non è bloccato.
- `CACHEPATH(path, expire, [default])` mantiene un valore dello stato nella cache (`CACHE()`): imposta il percorso al valore in cache quando c'è (o a `default`, che può essere una funzione) e salva ogni cambiamento sotto la chiave `path_<path>`.
- Un percorso è un percorso nello stato della pagina, quindi un nome come `name` o `location` è una proprietà di `window`: usa nomi tuoi (`person`, `prefs.mode`).
- `setTimeout2(id, fn, ms, [limit], [param])` è un `setTimeout()` con debounce: richiamarlo con lo stesso `id` riavvia il timer, quindi `fn` viene eseguito una volta, `ms` dopo l'ultima chiamata. Con `limit` il timer viene riavviato al massimo quel numero di volte e le chiamate successive sono ignorate finché `fn` non è stato eseguito, così un flusso di chiamate non può rimandarlo per sempre. `clearTimeout2(id)` lo annulla e restituisce `true` quando ce n'era uno.
- `CLONE(value)` fa una copia profonda (le date restano date), `COPY(from, to)` copia in profondità le proprietà di un oggetto in un altro e restituisce `to`. `NOOP` è una funzione che non fa nulla e `WARN(...)` scrive su `console.warn`.

```html public/index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>jComponent</title>
	<link rel="stylesheet" href="//cdn.componentator.com/spa.min@20.css" />
	<script src="//cdn.componentator.com/spa.min@20.js"></script>
</head>
<body>
	<p class="out"></p>
	<script>

		window.sample = { watched: 0 };

	</script>
</body>
</html>
```
