Перейти к основному содержимому

ModelArrayNode

Defined in: core/nodes/model-array-node.ts:71

Узел массива, делегирующий данные массиву FormModel (архитектура M1).

В отличие от ArrayNode (владеет элементами сам), ModelArrayNode НЕ владеет данными: массив принадлежит модели, а узел держит per-item формы элементов (привязанные к сигналам под-моделей) и синхронизирует их с длиной массива модели. Мутации (push/removeAt/move/…) делегируются массиву модели; per-item формы кэшируются по идентичности под-модели, поэтому при reorder/повторном рендере не пересоздаются (состояние и валидация сохраняются). Реализует тот же контракт, что ждут секции массива и useFormControl (length/value/valid/errors/at/push/…).

Обычно создаётся не напрямую, а createForm({ model, schema }): когда в схеме встречается узел массива { array: model.<field>, item: (item) => itemSchema }, форма материализует его как ModelArrayNode и кладёт под form.<field> (совместим с FormArraySection).

Example

const model = createModel<{ rows: { name: string; qty: number }[] }>({ rows: [] });

const rowItem = (item: FormModel<{ name: string; qty: number }>) => ({
name: { value: item.$.name, component: Input },
qty: { value: item.$.qty, component: Input },
});

const form = createForm({
model,
schema: {
children: [{ array: model.rows, item: rowItem }],
},
});

const rows = form.rows as unknown as ModelArrayNode<{ name: string; qty: number }>;
rows.push({ name: 'A', qty: 1 }); // мутация уезжает в model.rows
rows.at(0)?.name.setValue('B'); // правка поля элемента доезжает в под-модель
rows.length.value; // 1 (реактивная длина)

Extends

Type Parameters

T

T extends object

Accessors

items

Get Signature

get items(): Signal<FormProxy<T>[]>;

Defined in: core/nodes/model-array-node.ts:86

Сигнал per-item форм. Публичен в т.ч. чтобы isArrayNode распознавал узел как массив (duck-typing проверяет наличие items).

Returns

Signal<FormProxy<T>[]>

Constructors

Constructor

new ModelArrayNode<T>(control, buildItem): ModelArrayNode<T>;

Defined in: core/nodes/model-array-node.ts:105

Parameters

control

ModelArrayControl<T>

Реактивный массив модели (model.<path>).

buildItem

(item) => FormProxy<T>

Строитель формы элемента по его под-модели (инъекция, чтобы избежать цикла импорта с create-form). Обычно (item) => createForm({ model: item, schema: itemSchema(item) }).

Returns

ModelArrayNode<T>

Overrides

FormNode.constructor

Methods

at()

at(index): FormProxy<T> | undefined;

Defined in: core/nodes/model-array-node.ts:166

Parameters

index

number

Returns

FormProxy<T> | undefined


clear()

clear(): void;

Defined in: core/nodes/model-array-node.ts:197

Returns

void


clearErrors()

clearErrors(): void;

Defined in: core/nodes/model-array-node.ts:230

Очистить ошибки валидации

Returns

void

Overrides

FormNode.clearErrors


disable()

disable(): void;

Defined in: core/nodes/form-node.ts:380

Отключить узел

Template Method: обновляет статус в базовом классе, вызывает hook для кастомной логики в наследниках

Отключенные узлы не проходят валидацию и не включаются в getValue()

Returns

void

Inherited from

FormNode.disable


dispose()

dispose(): void;

Defined in: core/nodes/model-array-node.ts:278

Очистка подписки синхронизации И детерминированный teardown всех форм элементов. Без пробрасывания dispose в itemNodes эффекты/поведения каждой формы элемента (в т.ч. disposeSync вложенных ModelArrayNode) остались бы жить после teardown формы — утечка подписок.

Returns

void

Overrides

FormNode.dispose


enable()

enable(): void;

Defined in: core/nodes/form-node.ts:391

Включить узел

Template Method: обновляет статус в базовом классе, вызывает hook для кастомной логики в наследниках

Returns

void

Inherited from

FormNode.enable


forEach()

forEach(fn): void;

Defined in: core/nodes/model-array-node.ts:172

Parameters

fn

(item, index) => void

Returns

void


getErrors()

getErrors(options?): ValidationError[];

Defined in: core/nodes/form-node.ts:241

Получить ошибки валидации с фильтрацией

Позволяет фильтровать ошибки по различным критериям:

  • По коду ошибки
  • По сообщению (частичное совпадение)
  • По параметрам
  • Через кастомный предикат

Без параметров возвращает все ошибки (эквивалент errors.value)

Parameters

options?

ErrorFilterOptions

Опции фильтрации ошибок

Returns

ValidationError[]

Отфильтрованный массив ошибок валидации

Example

// Все ошибки
const allErrors = form.getErrors();

// Ошибки с конкретным кодом
const requiredErrors = form.getErrors({ code: 'required' });

// Ошибки с несколькими кодами
const errors = form.getErrors({ code: ['required', 'email'] });

// Ошибки по сообщению
const passwordErrors = form.getErrors({ message: 'Password' });

// Ошибки по параметрам
const minLengthErrors = form.getErrors({
params: { minLength: 8 }
});

// Кастомная фильтрация
const customErrors = form.getErrors({
predicate: (err) => err.code.startsWith('custom_')
});

Inherited from

FormNode.getErrors


getValue()

getValue(): T[];

Defined in: core/nodes/model-array-node.ts:202

Получить значение узла (non-reactive) Использует .peek() для получения значения без создания зависимости

Returns

T[]

Overrides

FormNode.getValue


insert()

insert(index, item?): void;

Defined in: core/nodes/model-array-node.ts:180

Parameters

index

number

item?

Partial<T>

Returns

void


map()

map<R>(fn): R[];

Defined in: core/nodes/model-array-node.ts:169

Type Parameters

R

R

Parameters

fn

(item, index) => R

Returns

R[]


markAsDirty()

markAsDirty(): void;

Defined in: core/nodes/form-node.ts:323

Отметить узел как dirty (значение изменено)

Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках

Returns

void

Inherited from

FormNode.markAsDirty


markAsPristine()

markAsPristine(): void;

Defined in: core/nodes/form-node.ts:334

Отметить узел как pristine (значение не изменено)

Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках

Returns

void

Inherited from

FormNode.markAsPristine


markAsTouched()

markAsTouched(): void;

Defined in: core/nodes/form-node.ts:301

Отметить узел как touched (пользователь взаимодействовал)

Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках

Returns

void

Inherited from

FormNode.markAsTouched


markAsUntouched()

markAsUntouched(): void;

Defined in: core/nodes/form-node.ts:312

Отметить узел как untouched

Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках

Returns

void

Inherited from

FormNode.markAsUntouched


move()

move(from, to): void;

Defined in: core/nodes/model-array-node.ts:190

Переместить элемент модель-массива. Делегирует мутацию массиву модели; внутренний effect пересоберёт itemNodes в новом порядке (per-item формы сохраняются по кешу идентичности).

Parameters

from

number

to

number

Returns

void


onDisable()

protected onDisable(): void;

Defined in: core/nodes/model-array-node.ts:261

Hook: вызывается после disable()

Переопределите в наследниках для дополнительной логики:

  • GroupNode: отключить все дочерние узлы
  • ArrayNode: отключить все элементы массива
  • FieldNode: очистить ошибки валидации

Returns

void

Example

// GroupNode
protected onDisable(): void {
this.fields.forEach(field => field.disable());
}

Overrides

FormNode.onDisable


onEnable()

protected onEnable(): void;

Defined in: core/nodes/model-array-node.ts:264

Hook: вызывается после enable()

Переопределите в наследниках для дополнительной логики:

  • GroupNode: включить все дочерние узлы
  • ArrayNode: включить все элементы массива
  • FieldNode: пустая реализация

Returns

void

Overrides

FormNode.onEnable


onMarkAsDirty()

protected onMarkAsDirty(): void;

Defined in: core/nodes/model-array-node.ts:251

Hook: вызывается после markAsDirty()

Переопределите в наследниках для дополнительной логики:

  • GroupNode: может обновить родительскую форму
  • ArrayNode: может обновить родительскую форму
  • FieldNode: пустая реализация

Returns

void

Overrides

FormNode.onMarkAsDirty


onMarkAsPristine()

protected onMarkAsPristine(): void;

Defined in: core/nodes/model-array-node.ts:256

Hook: вызывается после markAsPristine()

Переопределите в наследниках для дополнительной логики:

  • GroupNode: пометить все дочерние узлы как pristine
  • ArrayNode: пометить все элементы массива как pristine
  • FieldNode: пустая реализация

Returns

void

Overrides

FormNode.onMarkAsPristine


onMarkAsTouched()

protected onMarkAsTouched(): void;

Defined in: core/nodes/model-array-node.ts:241

Hook: вызывается после markAsTouched()

Переопределите в наследниках для дополнительной логики:

  • GroupNode: пометить все дочерние узлы как touched
  • ArrayNode: пометить все элементы массива как touched
  • FieldNode: пустая реализация (нет дочерних узлов)

Returns

void

Example

// GroupNode
protected onMarkAsTouched(): void {
this.fields.forEach(field => field.markAsTouched());
}

Overrides

FormNode.onMarkAsTouched


onMarkAsUntouched()

protected onMarkAsUntouched(): void;

Defined in: core/nodes/model-array-node.ts:246

Hook: вызывается после markAsUntouched()

Переопределите в наследниках для дополнительной логики:

  • GroupNode: пометить все дочерние узлы как untouched
  • ArrayNode: пометить все элементы массива как untouched
  • FieldNode: пустая реализация (нет дочерних узлов)

Returns

void

Overrides

FormNode.onMarkAsUntouched


patchValue()

patchValue(values): void;

Defined in: core/nodes/model-array-node.ts:209

Частично обновить значение узла Для FieldNode: работает как setValue Для GroupNode: обновляет только указанные поля Для ArrayNode: обновляет только указанные элементы

Parameters

values

(T | undefined)[]

Returns

void

Overrides

FormNode.patchValue


push()

push(item?): void;

Defined in: core/nodes/model-array-node.ts:177

Parameters

item?

Partial<T>

Returns

void


removeAt()

removeAt(index): void;

Defined in: core/nodes/model-array-node.ts:183

Parameters

index

number

Returns

void


reset()

reset(values?): void;

Defined in: core/nodes/model-array-node.ts:212

Сбросить узел к начальному состоянию

Parameters

values?

T[]

Returns

void

Overrides

FormNode.reset


resetToInitial()

resetToInitial(): void;

Defined in: core/nodes/model-array-node.ts:216

Returns

void


setErrors()

setErrors(errors): void;

Defined in: core/nodes/model-array-node.ts:227

Установить ошибки валидации извне

Parameters

errors

ValidationError[]

массив ошибок

Returns

void

Overrides

FormNode.setErrors


setValue()

setValue(values): void;

Defined in: core/nodes/model-array-node.ts:205

Установить значение узла

Parameters

values

T[]

Returns

void

Overrides

FormNode.setValue


swap()

swap(a, b): void;

Defined in: core/nodes/model-array-node.ts:194

Поменять местами два элемента модель-массива (см. move).

Parameters

a

number

b

number

Returns

void


touchAll()

touchAll(): void;

Defined in: core/nodes/form-node.ts:364

Пометить все поля (включая вложенные) как touched Алиас для markAsTouched(), но более явно показывает намерение пометить ВСЕ поля рекурсивно

Полезно для:

  • Показа всех ошибок валидации перед submit
  • Принудительного отображения ошибок при нажатии "Validate All"
  • Отображения невалидных полей в wizard/step form

Returns

void

Example

// Показать все ошибки перед submit
form.touchAll();
const isValid = await form.validate();
if (!isValid) {
// Все ошибки теперь видны пользователю
}

// Или использовать submit() который уже вызывает touchAll
await form.submit(async (values) => {
await api.save(values);
});

Inherited from

FormNode.touchAll


validate()

validate(): Promise<boolean>;

Defined in: core/nodes/model-array-node.ts:219

Запустить валидацию узла

Returns

Promise<boolean>

Promise<boolean> - true если валидация успешна

Overrides

FormNode.validate

Properties

_dirty

protected _dirty: Signal<boolean>;

Defined in: core/nodes/form-node.ts:66

Значение узла было изменено (dirty) Protected: наследники могут читать/изменять через методы

Inherited from

FormNode._dirty


_status

protected _status: Signal<FieldStatus>;

Defined in: core/nodes/form-node.ts:72

Текущий статус узла Protected: наследники могут читать/изменять через методы

Inherited from

FormNode._status


_touched

protected _touched: Signal<boolean>;

Defined in: core/nodes/form-node.ts:60

Пользователь взаимодействовал с узлом (touched) Protected: наследники могут читать/изменять через методы

Inherited from

FormNode._touched


dirty

readonly dirty: ReadonlySignal<boolean>;

Defined in: core/nodes/model-array-node.ts:95

Значение узла было изменено (dirty) Computed из _dirty для предоставления readonly интерфейса

Overrides

FormNode.dirty


disabled

readonly disabled: ReadonlySignal<boolean>;

Defined in: core/nodes/form-node.ts:109

Узел отключен (disabled)

Inherited from

FormNode.disabled


enabled

readonly enabled: ReadonlySignal<boolean>;

Defined in: core/nodes/form-node.ts:114

Узел включен (enabled)

Inherited from

FormNode.enabled


errors

readonly errors: ReadonlySignal<ValidationError[]>;

Defined in: core/nodes/model-array-node.ts:96

Массив ошибок валидации

Overrides

FormNode.errors


invalid

readonly invalid: ReadonlySignal<boolean>;

Defined in: core/nodes/model-array-node.ts:92

Узел невалиден (есть ошибки валидации)

Overrides

FormNode.invalid


length

readonly length: ReadonlySignal<number>;

Defined in: core/nodes/model-array-node.ts:98


pending

readonly pending: ReadonlySignal<boolean>;

Defined in: core/nodes/model-array-node.ts:93

Выполняется асинхронная валидация

Overrides

FormNode.pending


pristine

readonly pristine: ReadonlySignal<boolean>;

Defined in: core/nodes/form-node.ts:98

Значение узла не было изменено (pristine)

Inherited from

FormNode.pristine


status

readonly status: ReadonlySignal<FieldStatus>;

Defined in: core/nodes/model-array-node.ts:97

Текущий статус узла Computed из _status для предоставления readonly интерфейса

Overrides

FormNode.status


touched

readonly touched: ReadonlySignal<boolean>;

Defined in: core/nodes/model-array-node.ts:94

Пользователь взаимодействовал с узлом (touched) Computed из _touched для предоставления readonly интерфейса

Overrides

FormNode.touched


untouched

readonly untouched: ReadonlySignal<boolean>;

Defined in: core/nodes/form-node.ts:87

Пользователь не взаимодействовал с узлом (untouched)

Inherited from

FormNode.untouched


valid

readonly valid: ReadonlySignal<boolean>;

Defined in: core/nodes/model-array-node.ts:91

Узел валиден (все валидаторы прошли успешно)

Overrides

FormNode.valid


value

readonly value: ReadonlySignal<T[]>;

Defined in: core/nodes/model-array-node.ts:90

Текущее значение узла

  • Для FieldNode: значение поля
  • Для GroupNode: объект со значениями всех полей
  • Для ArrayNode: массив значений элементов

Overrides

FormNode.value