# Преки пътища за състоянието: INC, TOGGLE, NUL, UPDATE, UNWATCH, WAIT, BLOCKED и CACHEPATH

> Малки функции, които променят или наблюдават стойност на състоянието по нейния път, чакат, докато съществува стойност, изпълняват нещо само веднъж за период и държат стойност на състоянието в кеша.

Framework: jcomponent20
Product: jComponent 20 (jcomponent@20)
Language: bg
Content-SHA256: 55ab43d1d344598a4183583022c64a5f3250aa8bc59bbcb7f92fd3ee83f5fc9c
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: jcomponent20@3fedd009a277f50fddc608b97afbec553b67c51b
Review: not-recorded

Тези функции работят със състоянието на jComponent по **път** (`'user.visits'`), като `SET()` и `GET()`, и всяка от тях уведомява компонентите и наблюдателите на пътя.

- `INC(path, [value])` добавя `value` (по подразбиране `1`) към число; когато стойността е празна, започва от `0`, а когато е текст, първо се чете като число.
- `TOGGLE(path)` променя булева стойност (празна стойност става `true`). `NUL(path)` и неговият псевдоним `NULL(path)` задават стойността на `null`.
- `UPDATE(path)` (псевдоним `UPD`) уведомява всички, които използват пътя, **без да променя стойността**: използвайте го, след като сте променили обект или масив на място.
- `UNWATCH(path, [fn])` премахва наблюдателите на пътя, създадени с `WATCH()`; с `fn` само този.
- `WAIT(fn or path, callback)` изпълнява `callback`, щом функцията върне нещо истинно или пътят има стойност. Проверява веднага и после **на всеки 500 ms**.
- `BLOCKED(key, timeout, [callback])` връща `false` първия път и `true` през следващите `timeout` ms (работи и `'5 seconds'`): защита е срещу двойно кликване или повторна заявка. `callback` се изпълнява само когато не е блокирано.
- `CACHEPATH(path, expire, [default])` държи стойност на състоянието в кеша (`CACHE()`): задава пътя на кешираната стойност, когато има такава (или на `default`, което може да е функция), и записва всяка промяна под ключа `path_<path>`.
- Пътят е път в състоянието на страницата, така че име като `name` или `location` е свойство на `window`: използвайте собствени имена (`person`, `prefs.mode`).
- `setTimeout2(id, fn, ms, [limit], [param])` е `setTimeout()` с debounce: повторното извикване със същия `id` рестартира таймера, така че `fn` се изпълнява веднъж, `ms` след последното извикване. С `limit` таймерът се рестартира най-много толкова пъти, а следващите извиквания се игнорират, докато `fn` не се изпълни, така че поток от извиквания не може да го отлага вечно. `clearTimeout2(id)` го отменя и връща `true`, когато е имало такъв.
- `CLONE(value)` прави дълбоко копие (датите остават дати), `COPY(from, to)` копира дълбоко свойствата на един обект в друг и връща `to`. `NOOP` е функция, която не прави нищо, а `WARN(...)` пише в `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>
```
