Skip to content

Подписки и RaphRouter

Raph предоставляет несколько механизмов реакции на data paths. Они решают разные задачи и выполняются в разные моменты.

Сравнение механизмов

APIДля чегоКогда выполняется
track(node, mask)Связать data path с обычным phase pipelineВ фазе, выбранной по routes
observeData(node, mask, options)Направить path сразу в заданную фазу runtimeВ указанной фазе
subscribe(owner, mask, callback)Выполнить внешний control-flow callbackПосле фаз текущего тика
Raph.watch(mask, callback)Упрощённая реактивная подписка default appВ системной watch-фазе
RaphRouter<T>Независимый path matcherПри явном вызове match

Track

ts
app.track(node, 'orders[id=$orderId].status')

track регистрирует node в node router. При mutation runtime сначала определяет подходящие phases по их routes, затем расширяет набор затронутых нод согласно traversal каждой фазы.

untrack(node) снимает все masks ноды, а untrack(node, mask) — одну маску.

Direct data observer

ts
const dispose = runtime.observeData(node, 'orders.*', {
  phase: 'render',
  traversal: 'dirty-and-down',
})

dispose()

Observer явно задаёт target phase и не полагается на phase routes. Он принадлежит runtime и node и удаляется вместе с ними.

Control-flow subscription

ts
const dispose = runtime.subscribe(
  owner,
  'orders[id=$orderId].status',
  ({ events, params, matches }) => {
    console.log(events, params?.orderId, matches)
  },
)

dispose()

Callback получает batch событий после выполнения runtime phases. params содержит первый набор captures, а matches — все совпадения и их параметры.

Standalone RaphRouter

ts
import { RaphRouter } from '@endge/raph'

const router = new RaphRouter<string>()

router.add('orders[id=$orderId].status', 'status-handler')
router.add('orders.*', 'orders-handler')

const matches = router.matchWithParams('orders[id=10].status')

Основные методы:

  • add(mask, payload);
  • remove(mask, payload?);
  • removePayload(payload);
  • removeAll();
  • match(path);
  • matchWithParams(path);
  • matchIncludingPrefix(path);
  • matchIncludingPrefixWithParams(path);
  • collectByPrefix(prefix);
  • masksFor(payload).

Обычный match возвращает уникальные payload. Вариант matchWithParams возвращает отдельные совпадения с captures динамических сегментов.