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

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

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

FormNode.constructor

Methods

clearErrors()

clearErrors(): void;

Defined in: core/nodes/field-node.ts:395

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

Returns

void

Overrides

FormNode.clearErrors


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

FormNode.disable


dispose()

dispose(): void;

Defined in: core/nodes/field-node.ts:580

Очистить все ресурсы и таймеры Должен вызываться при unmount компонента

Returns

void

Example

useEffect(() => {
return () => {
field.dispose();
};
}, []);

Overrides

FormNode.dispose


enable()

enable(): void;

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

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

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

Returns

void

Inherited from

FormNode.enable


getErrors()

getErrors(options?): ValidationError[];

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

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

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

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

Без параметров возвращает все ошибки (эквивалент 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


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

FormNode.getValue


markAsDirty()

markAsDirty(): void;

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

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

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

Returns

void

Inherited from

FormNode.markAsDirty


markAsPristine()

markAsPristine(): void;

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

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

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

Returns

void

Inherited from

FormNode.markAsPristine


markAsTouched()

markAsTouched(): void;

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

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

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

Returns

void

Inherited from

FormNode.markAsTouched


markAsUntouched()

markAsUntouched(): void;

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

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

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

Returns

void

Inherited from

FormNode.markAsUntouched


onDisable()

protected onDisable(): void;

Defined in: core/nodes/field-node.ts:420

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

Для FieldNode: очищаем ошибки валидации

Returns

void

Overrides

FormNode.onDisable


onEnable()

protected onEnable(): void;

Defined in: core/nodes/field-node.ts:429

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

Для FieldNode: запускаем валидацию

Returns

void

Overrides

FormNode.onEnable


onMarkAsDirty()

protected onMarkAsDirty(): void;

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

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

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

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

Returns

void

Inherited from

FormNode.onMarkAsDirty


onMarkAsPristine()

protected onMarkAsPristine(): void;

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

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

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

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

Returns

void

Inherited from

FormNode.onMarkAsPristine


onMarkAsTouched()

protected onMarkAsTouched(): void;

Defined in: core/nodes/field-node.ts:409

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

Для FieldNode: если updateOn === 'blur', запускаем валидацию

Returns

void

Overrides

FormNode.onMarkAsTouched


onMarkAsUntouched()

protected onMarkAsUntouched(): void;

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

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

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

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

Returns

void

Inherited from

FormNode.onMarkAsUntouched


patchValue()

patchValue(value): void;

Defined in: core/nodes/field-node.ts:167

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

Parameters

value

Partial<T>

частичное значение для обновления

Returns

void

Overrides

FormNode.patchValue


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

FormNode.reset


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

ValidationError[]

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

Returns

void

Overrides

FormNode.setErrors


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?

SetValueOptions

опции установки значения

Returns

void

Overrides

FormNode.setValue


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

FormNode.touchAll


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

FormNode.validate


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

FormNode._dirty


_status

protected _status: Signal<FieldStatus>;

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

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

Inherited from

FormNode._status


_touched

protected _touched: Signal<boolean>;

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

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

Inherited from

FormNode._touched


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

FormNode.dirty


disabled

readonly disabled: ReadonlySignal<boolean>;

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

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

Inherited from

FormNode.disabled


enabled

readonly enabled: ReadonlySignal<boolean>;

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

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

Inherited from

FormNode.enabled


errors

readonly errors: ReadonlySignal<ValidationError[]>;

Defined in: core/nodes/field-node.ts:57

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

Overrides

FormNode.errors


invalid

readonly invalid: ReadonlySignal<boolean>;

Defined in: core/nodes/field-node.ts:54

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

Overrides

FormNode.invalid


pending

readonly pending: ReadonlySignal<boolean>;

Defined in: core/nodes/field-node.ts:56

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

Overrides

FormNode.pending


pristine

readonly pristine: ReadonlySignal<boolean>;

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

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

Inherited from

FormNode.pristine


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

FormNode.status


touched

readonly touched: ReadonlySignal<boolean>;

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

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

Inherited from

FormNode.touched


untouched

readonly untouched: ReadonlySignal<boolean>;

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

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

Inherited from

FormNode.untouched


valid

readonly valid: ReadonlySignal<boolean>;

Defined in: core/nodes/field-node.ts:53

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

Overrides

FormNode.valid


value

readonly value: ReadonlySignal<T>;

Defined in: core/nodes/field-node.ts:52

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

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

Overrides

FormNode.value