FieldNode
Defined in: core/nodes/field-node.ts:36
FieldNode - узел для отдельного поля формы
Example
const field = new FieldNode({
value: '',
component: Input,
validators: [required, email],
});
field.setValue('test@mail.com');
await field.validate();
console.log(field.valid.value); // true
Extends
FormNode<T>
Type Parameters
T
T
Constructors
Constructor
new FieldNode<T>(config): FieldNode<T>;
Defined in: core/nodes/field-node.ts:92
Parameters
config
FieldConfig<T>
Returns
FieldNode<T>
Overrides
Methods
clearErrors()
clearErrors(): void;
Defined in: core/nodes/field-node.ts:395
Очистить ошибки валидации
Returns
void
Overrides
computeFrom()
computeFrom<TSource>(sources, computeFn): () => void;
Defined in: core/nodes/field-node.ts:546
Вычисляемое значение из других полей Автоматически обновляет текущее поле при изменении источников
Type Parameters
TSource
TSource extends readonly unknown[]
Parameters
sources
ReadonlySignal<TSource[number]>[]
Массив ReadonlySignal для отслеживания
computeFn
(...values) => T
Функция вычисления нового значения
Returns
Функция отписки для cleanup
(): void;
Returns
void
Example
// Автоматический расчет первоначального взноса (20% от стоимости)
const dispose = form.initialPayment.computeFrom(
[form.propertyValue.value],
(propertyValue) => {
return propertyValue ? propertyValue * 0.2 : null;
}
);
// Cleanup
useEffect(() => dispose, []);
disable()
disable(): void;
Defined in: core/nodes/form-node.ts:370
Отключить узел
Template Method: обновляет статус в базовом классе, вызывает hook для кастомной логики в наследниках
Отключенные узлы не проходят валидацию и не включаются в getValue()
Returns
void
Inherited from
dispose()
dispose(): void;
Defined in: core/nodes/field-node.ts:580
Очистить все ресурсы и таймеры Должен вызываться при unmount компонента
Returns
void
Example
useEffect(() => {
return () => {
field.dispose();
};
}, []);
Overrides
enable()
enable(): void;
Defined in: core/nodes/form-node.ts:381
Включить узел
Template Method: обновляет статус в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
getErrors()
getErrors(options?): ValidationError[];
Defined in: core/nodes/form-node.ts:231
Получить ошибки валидации с фильтрацией
Позволяет фильтровать ошибки по различным критериям:
- По коду ошибки
- По сообщению (частичное совпадение)
- По параметрам
- Через кастомный предикат
Без параметров возвращает все ошибки (эквивалент 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
getUpdateOn()
getUpdateOn(): "change" | "blur" | "submit";
Defined in: core/nodes/field-node.ts:488
Returns
"change" | "blur" | "submit"
getValue()
getValue(): T;
Defined in: core/nodes/field-node.ts:134
Получить значение узла (non-reactive) Использует .peek() для получения значения без создания зависимости
Returns
T
Overrides
markAsDirty()
markAsDirty(): void;
Defined in: core/nodes/form-node.ts:313
Отметить узел как dirty (значение изменено)
Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
markAsPristine()
markAsPristine(): void;
Defined in: core/nodes/form-node.ts:324
Отметить узел как pristine (значение не изменено)
Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
markAsTouched()
markAsTouched(): void;
Defined in: core/nodes/form-node.ts:291
Отметить узел как touched (пользователь взаимодействовал)
Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
markAsUntouched()
markAsUntouched(): void;
Defined in: core/nodes/form-node.ts:302
Отметить узел как untouched
Template Method: обновляет signal в базовом классе, вызывает hook для кастомной логики в наследниках
Returns
void
Inherited from
onDisable()
protected onDisable(): void;
Defined in: core/nodes/field-node.ts:420
Hook: вызывается после disable()
Для FieldNode: очищаем ошибки валидации
Returns
void
Overrides
onEnable()
protected onEnable(): void;
Defined in: core/nodes/field-node.ts:429
Hook: вызывается после enable()
Для FieldNode: запускаем валидацию
Returns
void
Overrides
onMarkAsDirty()
protected onMarkAsDirty(): void;
Defined in: core/nodes/form-node.ts:447
Hook: вызывается после markAsDirty()
Переопределите в наследниках для дополнительной логики:
- GroupNode: может обновить родительскую форму
- ArrayNode: может обновить родительскую форму
- FieldNode: пустая реализация
Returns
void
Inherited from
onMarkAsPristine()
protected onMarkAsPristine(): void;
Defined in: core/nodes/form-node.ts:459
Hook: вызывается после markAsPristine()
Переопределите в наследниках для дополнительной логики:
- GroupNode: пометить все дочерние узлы как pristine
- ArrayNode: пометить все элементы массива как pristine
- FieldNode: пустая реализация
Returns
void
Inherited from
onMarkAsTouched()
protected onMarkAsTouched(): void;
Defined in: core/nodes/field-node.ts:409
Hook: вызывается после markAsTouched()
Для FieldNode: если updateOn === 'blur', запускаем валидацию
Returns
void
Overrides
onMarkAsUntouched()
protected onMarkAsUntouched(): void;
Defined in: core/nodes/form-node.ts:435
Hook: вызывается после markAsUntouched()
Переопределите в наследниках для дополнительной логики:
- GroupNode: пометить все дочерние узлы как untouched
- ArrayNode: пометить все элементы массива как untouched
- FieldNode: пустая реализация (нет дочерних узлов)
Returns
void
Inherited from
patchValue()
patchValue(value): void;
Defined in: core/nodes/field-node.ts:167
Частично обновить значение узла Для FieldNode: работает как setValue Для GroupNode: обновляет только указанные поля Для ArrayNode: обновляет только указанные элементы
Parameters
value
Partial<T>
частичное значение для обновления
Returns
void
Overrides
reset()
reset(value?): void;
Defined in: core/nodes/field-node.ts:194
Сбросить поле к указанному значению (или к initialValue)
Parameters
value?
T
опциональное значение для сброса. Если не указано, используется initialValue
Returns
void
Remarks
Этот метод:
- Устанавливает значение в value или initialValue
- Очищает ошибки валидации
- Сбрасывает touched/dirty флаги
- Устанавливает статус в 'valid'
Если вам нужно сбросить к исходному значению, используйте resetToInitial()
Example
// Сброс к initialValue
field.reset();
// Сброс к новому значению
field.reset('new value');
Overrides
resetToInitial()
resetToInitial(): void;
Defined in: core/nodes/field-node.ts:227
Сбросить поле к исходному значению (initialValue)
Returns
void
Remarks
Алиас для reset() без параметров, но более явный:
- resetToInitial() - явно показывает намерение вернуться к начальному значению
- reset() - может принимать новое значение
Полезно когда:
- Пользователь нажал "Cancel" - вернуть форму в исходное состояние
- Форма была изменена через reset(newValue), но нужно вернуться к самому началу
- Явное намерение показать "отмену всех изменений"
Example
const field = new FieldNode({ value: 'initial', component: Input });
field.setValue('changed');
field.reset('temp value');
console.log(field.value.value); // 'temp value'
field.resetToInitial();
console.log(field.value.value); // 'initial'
setErrors()
setErrors(errors): void;
Defined in: core/nodes/field-node.ts:390
Установить ошибки валидации извне
Parameters
errors
массив ошибок
Returns
void
Overrides
setUpdateOn()
setUpdateOn(updateOn): void;
Defined in: core/nodes/field-node.ts:484
Динамически изменяет триггер валидации (updateOn) Полезно для адаптивной валидации - например, переключиться на instant feedback после первого submit
Parameters
updateOn
новый триггер валидации: 'change' | 'blur' | 'submit'
"change" | "blur" | "submit"
Returns
void
Example
// Сценарий 1: Instant feedback после submit
const form = new GroupNode({
email: {
value: '',
component: Input,
updateOn: 'submit', // Изначально валидация только при submit
validators: [required, email]
}
});
await form.submit(async (values) => {
// После submit переключаем на instant feedback
form.email.setUpdateOn('change');
await api.save(values);
});
// Теперь валидация происходит при каждом изменении
// Сценарий 2: Прогрессивное улучшение
form.email.setUpdateOn('blur'); // Сначала только при blur
// ... пользователь начинает вводить ...
form.email.setUpdateOn('change'); // Переключаем на change для real-time feedback
setValue()
setValue(value, options?): void;
Defined in: core/nodes/field-node.ts:138
Установить значение узла
Parameters
value
T
новое значение
options?
опции установки значения
Returns
void
Overrides
touchAll()
touchAll(): void;
Defined in: core/nodes/form-node.ts:354
Пометить все поля (включая вложенные) как 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
updateComponentProps()
updateComponentProps(props): void;
Defined in: core/nodes/field-node.ts:445
Обновляет свойства компонента (например, опции для Select)
Parameters
props
Partial<Record<string, any>>
Returns
void
Example
// Обновление опций для Select после загрузки справочников
form.registrationAddress.city.updateComponentProps({
options: cities
});
validate()
validate(options?): Promise<boolean>;
Defined in: core/nodes/field-node.ts:249
Запустить валидацию поля
Parameters
options?
опции валидации
debounce?
number
Returns
Promise<boolean>
Promise<boolean> - true если поле валидно
Remarks
Метод защищен от race conditions через validationId. При быстром вводе только последняя валидация применяет результаты.
Example
// Обычная валидация
await field.validate();
// С debounce
await field.validate({ debounce: 300 });
Overrides
watch()
watch(callback): () => void;
Defined in: core/nodes/field-node.ts:513
Подписка на изменения значения поля Автоматически отслеживает изменения через @preact/signals effect
Parameters
callback
(value) => void | Promise<void>
Функция, вызываемая при изменении значения
Returns
Функция отписки для cleanup
(): void;
Returns
void
Example
const unsubscribe = form.email.watch((value) => {
console.log('Email changed:', value);
});
// Cleanup
useEffect(() => unsubscribe, []);
Properties
_dirty
protected _dirty: Signal<boolean>;
Defined in: core/nodes/form-node.ts:56
Значение узла было изменено (dirty) Protected: наследники могут читать/изменять через методы
Inherited from
_status
protected _status: Signal<FieldStatus>;
Defined in: core/nodes/form-node.ts:62
Текущий статус узла Protected: наследники могут читать/изменять через методы
Inherited from
_touched
protected _touched: Signal<boolean>;
Defined in: core/nodes/form-node.ts:50
Пользователь взаимодействовал с узлом (touched) Protected: наследники могут читать/изменять через методы
Inherited from
component
readonly component: ComponentType<any>;
Defined in: core/nodes/field-node.ts:86
componentProps
readonly componentProps: ReadonlySignal<Record<string, any>>;
Defined in: core/nodes/field-node.ts:59
dirty
readonly dirty: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:83
Значение узла было изменено (dirty) Computed из _dirty для предоставления readonly интерфейса
Inherited from
disabled
readonly disabled: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:99
Узел отключен (disabled)
Inherited from
enabled
readonly enabled: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:104
Узел включен (enabled)
Inherited from
errors
readonly errors: ReadonlySignal<ValidationError[]>;
Defined in: core/nodes/field-node.ts:57
Массив ошибок валидации
Overrides
invalid
readonly invalid: ReadonlySignal<boolean>;
Defined in: core/nodes/field-node.ts:54
Узел невалиден (есть ошибки валидации)
Overrides
pending
readonly pending: ReadonlySignal<boolean>;
Defined in: core/nodes/field-node.ts:56
Выполняется асинхронная валидация
Overrides
pristine
readonly pristine: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:88
Значение узла не было изменено (pristine)
Inherited from
shouldShowError
readonly shouldShowError: ReadonlySignal<boolean>;
Defined in: core/nodes/field-node.ts:65
Вычисляемое свойство: нужно ли показывать ошибку Ошибка показывается если поле невалидно И (touched ИЛИ dirty)
status
readonly status: ReadonlySignal<FieldStatus>;
Defined in: core/nodes/form-node.ts:94
Текущий статус узла Computed из _status для предоставления readonly интерфейса
Inherited from
touched
readonly touched: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:72
Пользователь взаимодействовал с узлом (touched) Computed из _touched для предоставления readonly интерфейса
Inherited from
untouched
readonly untouched: ReadonlySignal<boolean>;
Defined in: core/nodes/form-node.ts:77
Пользователь не взаимодействовал с узлом (untouched)
Inherited from
valid
readonly valid: ReadonlySignal<boolean>;
Defined in: core/nodes/field-node.ts:53
Узел валиден (все валидаторы прошли успешно)
Overrides
value
readonly value: ReadonlySignal<T>;
Defined in: core/nodes/field-node.ts:52
Текущее значение узла
- Для FieldNode: значение поля
- Для GroupNode: объект со значениями всех полей
- Для ArrayNode: массив значений элементов