# Skróty stanu: INC, TOGGLE, NUL, UPDATE, UNWATCH, WAIT, BLOCKED i CACHEPATH

> Małe funkcje, które zmieniają lub obserwują wartość stanu według jej ścieżki, czekają, aż wartość istnieje, uruchamiają coś tylko raz w okresie i trzymają wartość stanu w cache.

Framework: jcomponent20
Product: jComponent 20 (jcomponent@20)
Language: pl
Content-SHA256: 1815c1fb0a18ae1173fcb3b60713ef0b3176ddaee24cb9a325b23c219f667845
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: jcomponent20@3fedd009a277f50fddc608b97afbec553b67c51b
Review: not-recorded

Te funkcje działają na stanie jComponent według **ścieżki** (`'user.visits'`), jak `SET()` i `GET()`, a każda z nich powiadamia komponenty i obserwatorów ścieżki.

- `INC(path, [value])` dodaje `value` (domyślnie `1`) do liczby; gdy wartość jest pusta, zaczyna od `0`, a gdy jest tekstem, najpierw jest odczytywana jako liczba.
- `TOGGLE(path)` zmienia wartość logiczną (pusta wartość staje się `true`). `NUL(path)` i jego alias `NULL(path)` ustawiają wartość na `null`.
- `UPDATE(path)` (alias `UPD`) powiadamia wszystkich, którzy używają ścieżki, **bez zmiany wartości**: użyj go po zmodyfikowaniu obiektu lub tablicy w miejscu.
- `UNWATCH(path, [fn])` usuwa obserwatorów ścieżki utworzonych przez `WATCH()`; z `fn` tylko tego jednego.
- `WAIT(fn or path, callback)` uruchamia `callback`, gdy tylko funkcja zwróci coś prawdziwego lub ścieżka ma wartość. Sprawdza od razu, a potem **co 500 ms**.
- `BLOCKED(key, timeout, [callback])` zwraca `false` za pierwszym razem i `true` przez następne `timeout` ms (działa też `'5 seconds'`): to ochrona przed podwójnym kliknięciem lub powtórzonym żądaniem. `callback` uruchamia się tylko wtedy, gdy nie jest zablokowane.
- `CACHEPATH(path, expire, [default])` trzyma wartość stanu w cache (`CACHE()`): ustawia ścieżkę na wartość z cache, jeśli jest (lub na `default`, które może być funkcją), i zapisuje każdą zmianę pod kluczem `path_<path>`.
- Ścieżka to ścieżka w stanie strony, więc nazwa taka jak `name` czy `location` jest właściwością `window`: używaj własnych nazw (`person`, `prefs.mode`).
- `setTimeout2(id, fn, ms, [limit], [param])` to `setTimeout()` z debounce: ponowne wywołanie z tym samym `id` restartuje licznik, więc `fn` uruchamia się raz, `ms` po ostatnim wywołaniu. Z `limit` licznik jest restartowany co najwyżej tyle razy, a kolejne wywołania są ignorowane, dopóki `fn` się nie uruchomi, więc strumień wywołań nie może go odkładać w nieskończoność. `clearTimeout2(id)` go anuluje i zwraca `true`, gdy jakiś był.
- `CLONE(value)` robi głęboką kopię (daty pozostają datami), `COPY(from, to)` głęboko kopiuje właściwości jednego obiektu do drugiego i zwraca `to`. `NOOP` to funkcja, która nic nie robi, a `WARN(...)` pisze do `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>
```
