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
FormNode<T[]>
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
Реактивный массив модели (model.<path>).
buildItem
(item) => FormProxy<T>
Строитель формы элемента по его под-модели (инъекция, чтобы избежать цикла
импорта с create-form). Обычно (item) => createForm({ model: item, schema: itemSchema(item) }).
Returns
ModelArrayNode<T>
Overrides
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
disable()
disable(): void;
Defined in: core/nodes/form-node.ts:380
Отключить узел
Template Method: обновляет статус в базовом классе, вызывает hook для кастомной логики в наследниках
Отключенные узлы не проходят валидацию и не включаются в getValue()
Returns
void
Inherited from
dispose()
dispose(): void;
Defined in: core/nodes/model-array-node.ts:278
Очистка подписки синхронизации И детерминированный teardown всех форм элементов. Без пробрасывания dispose в itemNodes эффекты/поведения каждой формы элемента (в т.ч. disposeSync вложенных ModelArrayNode) остались бы жить после teardown формы — утечка подписок.
Returns
void
Overrides
enable()
enable(): void;
Defined in: core/nodes/form-node.ts:391
Включить узел
Template Method: обновляет статус в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
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?
Опции фильтрации ошибок
Returns
Отфильтрованный массив ошибок валидации
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
getValue()
getValue(): T[];
Defined in: core/nodes/model-array-node.ts:202
Получить значение узла (non-reactive) Использует .peek() для получения значения без создания зависимости
Returns
T[]
Overrides
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
markAsPristine()
markAsPristine(): void;
Defined in: core/nodes/form-node.ts:334
Отметить узел как pristine (значение не изменено)
Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
markAsTouched()
markAsTouched(): void;
Defined in: core/nodes/form-node.ts:301
Отметить узел как touched (пользователь взаимодействовал)
Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
markAsUntouched()
markAsUntouched(): void;
Defined in: core/nodes/form-node.ts:312
Отметить узел как untouched
Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
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
onEnable()
protected onEnable(): void;
Defined in: core/nodes/model-array-node.ts:264
Hook: вызывается после enable()
Переопределите в наследниках для дополнительной логики:
- GroupNode: включить все дочерние узлы
- ArrayNode: включить все элементы массива
- FieldNode: пустая реализация
Returns
void
Overrides
onMarkAsDirty()
protected onMarkAsDirty(): void;
Defined in: core/nodes/model-array-node.ts:251
Hook: вызывается после markAsDirty()
Переопределите в наследниках для дополнительной логики:
- GroupNode: может обновить родительскую форму
- ArrayNode: может обновить родительскую форму
- FieldNode: пустая реализация
Returns
void
Overrides
onMarkAsPristine()
protected onMarkAsPristine(): void;
Defined in: core/nodes/model-array-node.ts:256
Hook: вызывается после markAsPristine()
Переопределите в наследниках для дополнительной логики:
- GroupNode: пометить все дочерние узлы как pristine
- ArrayNode: пометить все элементы массива как pristine
- FieldNode: пустая реализация
Returns
void
Overrides
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
onMarkAsUntouched()
protected onMarkAsUntouched(): void;
Defined in: core/nodes/model-array-node.ts:246
Hook: вызывается после markAsUntouched()
Переопределите в наследниках для дополнительной логики:
- GroupNode: пометить все дочерние узлы как untouched
- ArrayNode: пометить все элементы массива как untouched
- FieldNode: пустая реализация (нет дочерних узлов)
Returns
void
Overrides
patchValue()
patchValue(values): void;
Defined in: core/nodes/model-array-node.ts:209
Частично обновить значение узла Для FieldNode: работает как setValue Для GroupNode: обновляет только указанные поля Для ArrayNode: обновляет только указанные элементы
Parameters
values
(T | undefined)[]
Returns
void
Overrides
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
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
массив ошибок
Returns
void
Overrides
setValue()
setValue(values): void;
Defined in: core/nodes/model-array-node.ts:205
Установить значение узла
Parameters
values
T[]
Returns
void
Overrides
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
validate()
validate(): Promise<boolean>;
Defined in: core/nodes/model-array-node.ts:219
Запустить валидацию узла
Returns
Promise<boolean>
Promise<boolean> - true если валидация успешна
Overrides
Properties
_dirty
protected _dirty: Signal<boolean>;
Defined in: core/nodes/form-node.ts:66
Значение узла было изменено (dirty) Protected: наследники могут читать/изменять через методы
Inherited from
_status
protected _status: Signal<FieldStatus>;
Defined in: core/nodes/form-node.ts:72
Текущий статус узла Protected: наследники могут читать/изменять через методы
Inherited from
_touched
protected _touched: Signal<boolean>;
Defined in: core/nodes/form-node.ts:60
Пользователь взаимодействовал с узлом (touched) Protected: наследники могут читать/изменять через методы
Inherited from
dirty
readonly dirty: ReadonlySignal<boolean>;
Defined in: core/nodes/model-array-node.ts:95
Значение узла было изменено (dirty) Computed из _dirty для предоставления readonly интерфейса
Overrides
disabled
readonly disabled: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:109
Узел отключен (disabled)
Inherited from
enabled
readonly enabled: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:114
Узел включен (enabled)
Inherited from
errors
readonly errors: ReadonlySignal<ValidationError[]>;
Defined in: core/nodes/model-array-node.ts:96
Массив ошибок валидации
Overrides
invalid
readonly invalid: ReadonlySignal<boolean>;
Defined in: core/nodes/model-array-node.ts:92
Узел невалиден (есть ошибки валидации)
Overrides
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
pristine
readonly pristine: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:98
Значение узла не было изменено (pristine)
Inherited from
status
readonly status: ReadonlySignal<FieldStatus>;
Defined in: core/nodes/model-array-node.ts:97
Текущий статус узла Computed из _status для предоставления readonly интерфейса
Overrides
touched
readonly touched: ReadonlySignal<boolean>;
Defined in: core/nodes/model-array-node.ts:94
Пользователь взаимодействовал с узлом (touched) Computed из _touched для предоставления readonly интерфейса
Overrides
untouched
readonly untouched: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:87
Пользователь не взаимодействовал с узлом (untouched)
Inherited from
valid
readonly valid: ReadonlySignal<boolean>;
Defined in: core/nodes/model-array-node.ts:91
Узел валиден (все валидаторы прошли успешно)
Overrides
value
readonly value: ReadonlySignal<T[]>;
Defined in: core/nodes/model-array-node.ts:90
Текущее значение узла
- Для FieldNode: значение поля
- Для GroupNode: объект со значениями всех полей
- Для ArrayNode: массив значений элементов