Skip to content

Raph Meta

Meta-plane хранит произвольную пользовательскую metadata отдельно от обычных данных Raph. Metadata привязана к существующему DataPath, но не попадает в Raph.data, Store snapshots, DataView и derived graph.

ts
Raph.set('sandboxItems[id=42].flightCarrier', 'SU')

Raph.meta.set(
  'sandboxItems[id=$id].flightCarrier',
  'aodb.optimistic',
  {
    status: 'waiting',
    optimisticValue: 'SU',
    previousValue: 'LH',
  },
  { vars: { id: 42 } },
)

API

ts
Raph.meta.get(path, namespace?, options?)
Raph.meta.has(path, namespace?, options?)
Raph.meta.set(path, namespace, value, options?)
Raph.meta.merge(path, namespace, value, options?)
Raph.meta.delete(path, namespace?, options?)
Raph.meta.watch(pathOrMask, callback, options?)

Без namespace get возвращает объект namespaces exact path. set и merge требуют непустой namespace. Wildcard разрешён в watch, но запрещён в writes.

Meta можно записать только для существующего data owner. Путь со значением undefined существует; это проверяет Raph.has(path). Удаление data path каскадно удаляет Meta поддерева, а замена parent удаляет metadata только у исчезнувших descendants.

Реактивность

Data observers не получают Meta events, Meta observers не запускают derived graph. В одной Raph.transaction оба слоя доставляются согласованно, и каждый затронутый runtime инвалидируется один раз.

Meta привязана к адресу. Для коллекций предпочтителен стабильный selector rows[id=$id]; rows[3] описывает позицию и после перестановки может относиться к другой записи.

Чтение в Component SFC

Component SFC не получает Raph и физические пути напрямую. Read-only фасад $data.metaOf(reference, namespace?) восстанавливает путь по provenance входного prop и подписывает runtime на Meta-plane:

vue
<Badge
  v-if="$data.metaOf(row.flightCarrier, 'aodb.optimistic')?.status === 'waiting'"
  tone="warning"
>
  Ожидает подтверждения
</Badge>

Meta может принадлежать не только полю, но и всей строке. Для этого Update пишет namespace в owner path записи, а SFC передаёт саму строку:

vue
<Table
  :rows="rows"
  row-key="id"
  :row-state="{
    waiting: $data.metaOf(row, 'ui.optimistic')?.status === 'waiting',
  }"
>
  <!-- columns -->
</Table>

row и $row.data обозначают DataPath текущей записи; row.field и $row.data.field — DataPath конкретного поля.

Без namespace метод возвращает объект всех namespaces exact path. Подробнее об области видимости и допустимых ссылках: контекстные переменные Component SFC.