Зависимое состояние через linkedSignal¶
30.09.2026
Функцией signal в коде Angular держат состояние. Иногда оно зависит от какого-то другого состояния. Например, компонент, в котором пользователь выбирает способ доставки заказа:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
В этом примере selectedOption по умолчанию равен первому варианту и меняется, если пользователь выбирает другой. Но shippingOptions — тоже сигнал, и его значение может измениться. Когда shippingOptions меняется, в selectedOption может остаться значение, которого среди вариантов уже нет.
Функция linkedSignal создаёт сигнал для состояния, которое по сути связано с другим состоянием. В том же примере linkedSignal заменяет signal:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
linkedSignal устроен похоже на signal, с одним отличием: вместо значения по умолчанию передают функцию вычисления, как в computed. Когда результат вычисления меняется, значение linkedSignal становится этим результатом. Так у linkedSignal остаётся допустимое значение.
Ниже видно, как значение linkedSignal меняется вместе со связанным состоянием:
1 2 3 4 5 6 7 8 9 | |
Учёт предыдущего состояния¶
Иногда вычислению linkedSignal нужно предыдущее значение самого linkedSignal.
В примере выше при изменении shippingOptions сигнал selectedOption каждый раз возвращается к первому варианту. Выбор пользователя можно сохранить, если выбранный вариант всё ещё есть в списке. Для этого linkedSignal создают с отдельными источником и вычислением:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | |
В linkedSignal можно передать не одну функцию вычисления, а объект с отдельными свойствами source и computation.
source может быть любым сигналом, например computed или входом input компонента. linkedSignal меняет значение, когда меняется source или любой сигнал, к которому обратились в computation, и записывает результат переданного computation.
computation — функция. Она получает новое значение source и объект previous. У previous два свойства. previous.source — прежнее значение source, previous.value — прежнее значение linkedSignal. По этим прежним значениям решают, каким будет новый результат вычисления.
С параметром previous аргументы обобщённого типа у linkedSignal указывают явно. Первый обобщённый тип — это тип source, второй — тип результата computation.
Своё сравнение на равенство¶
Как и у любого другого сигнала, у linkedSignal можно задать свою функцию равенства. По ней зависимости ниже по графу решают, изменилось ли значение linkedSignal, то есть результат вычисления:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Настройка операции set¶
Иногда set и update у linkedSignal должны записывать значение обратно в источник состояния, а не менять сам linkedSignal. Такое поведение задают функцией set в параметрах.
Своя функция set получает два аргумента:
- Новое значение, которое записывают.
- Функцию
rawSet. Её вызов обновляет внутреннее состояниеlinkedSignalнапрямую — так же, как поведение по умолчанию.
Через rawSet значение linkedSignal обновляют напрямую. Это нужно, чтобы не запускать вычисление: например, оно дорогое, а результат уже известен.
Запись обратно в исходный сигнал¶
Возьмём компонент, который показывает температуру в градусах Фаренгейта и даёт её редактировать, а источником состояния держит сигнал в градусах Цельсия:
1 2 3 4 5 6 7 8 9 10 11 | |
Обновление свойства внутри родительского объекта¶
Другой частый случай — обновить одно свойство внутри родительского объекта. Родитель хранится в сигнале, а связь ведёт к вложенному свойству:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
Источник: https://angular.dev/guide/signals/linked-signal