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

enableWhen()

function enableWhen(
target,
condition,
options?): BehaviorCleanup;

Defined in: core/model/behaviors.ts:134

Условное включение поля (state-операция). Резолвит ноду по сигналу-цели через реестр сигнал→нода (заполняется createForm) и вызывает enable()/disable() (+reset() при resetOnDisable). condition реактивен (читает свои сигналы модели).

Запись состояния отложена через runOutsideEffect (микротаск) для защиты от «Cycle detected». ⚠️ Поле должно быть материализовано в форме (createForm) — иначе ноды в реестре нет (например, элемент массива, который строится per-item).

⚠️ Если то же поле одновременно является целью compute/computeFrom, обязательно ограничь compute тем же условием (when), что и это enableWhen. Механизмы не согласованы: enableWhen работает со статус-машиной ноды (enable/disable/reset), а compute пишет target.value напрямую в сигнал модели и проверяет только собственный options.when — состояние disabled он НЕ смотрит. Поэтому при выключенном поле любое изменение зависимости compute молча заново заполнит его (а с resetOnDisable — перезапишет только что сброшенное значение), и так как getValue()/submit включают disabled-поля, мусор утечёт в payload. Это аналог правила #13 гайда add-behavior, которое сегодня сформулировано только для copyFrom; для compute то же ограничение обязательно.

Parameters

target

ReadonlySignal<unknown>

condition

() => boolean

options?

resetOnDisable?

boolean

Returns

BehaviorCleanup

Example

enableWhen(model.$.propertyValue, () => model.loanType === 'mortgage', { resetOnDisable: true });

// Поле-цель compute, которое ТАКЖЕ в resetOnDisable enableWhen: compute обязан нести тот же when,
// иначе initialPayment заново заполнится в выключенном состоянии и утечёт в submit.
compute(model.$.initialPayment, () => model.propertyValue * 0.2, {
when: () => model.loanType === 'mortgage',
});