Пришло время углубиться в текущую концепцию реактивности в Angular и представить новый реактивный примитив, а именно сигналы. Когда люди говорят о реактивности, в основном на ум приходят две темы: «RxJS» и «Zone.js». За последние пару лет сообщество сильно разделилось по поводу использования RxJS. Одна половина хотела бы лучшей интеграции с Angular, тогда как другая половина была бы довольна текущим состоянием.

В следующих разделах я расскажу вам, почему Angular выбирает этот примитив и какие планы на будущие версии.

Почему?

С момента появления Angular использование RxJS в Angular было очень спорной темой. Еще в декабре 2015 года предложение использовать Observables для ввода (https://github.com/angular/angular/issues/5689) разделило сообщество. К неудовольствию части сообщества, команда Angular решила больше не интегрировать RxJS.

Что сообщество потребовало от команды Angular для реализации?

Во-первых, лучший опыт разработчика, когда дело доходит до использования RxJS, а во-вторых, детальное обнаружение изменений.

Однако со временем команда Angular провела небольшое исследование того, как удовлетворить эти требования, и наткнулась на Signals.

Почему именно Сигналы?

В отличие от RxJS, сигналы синхронны и имеют некоторые преимущества:

· Глюков нет (элегантно решают алмазную проблему)

· Нет необходимости программно закрывать подписку (автоматическая подписка и отписка)

· А они очень простые

Проблема с бриллиантами?

Одной из наиболее распространенных проблем с реактивными алгоритмами является проблема алмаза. Поскольку входные данные не синхронные, а асинхронные, D может оцениваться дважды, потому что C изменяется. Это приведет к появлению значений D’ и D вскоре после другого, что называется сбоем.

Почему нет необходимости подписываться и отписываться?

Существует реактивный примитив под названием effect, который автоматически обрабатывает подписки.

Что?

Сигналы — это реактивные примитивы, которые позволяют синхронно отслеживать свое состояние. Таким образом, Сигналы не заменяют RxJS, а решают некоторые проблемы, возникающие при использовании RxJS.

Сигнал имеет сеттер-метод, который изменяет текущее значение. Потребитель, с другой стороны, может только прочитать это значение и будет уведомлен о любых изменениях.

Как это работает?

Существует три реактивных примитива: сигнал, вычисленный и эффект. Сигнал представляет собой структуру данных, которая содержит некоторое значение. При использовании вычисляемых сигналов их можно комбинировать. Чтобы получать уведомления об изменении сигналов, можно использовать эффект.

Как?

Сигналы можно использовать

· в компонентах

· услуги

· или в реализации магазина

Как это влияет на рендеринг в Angular?

В Angular все приложение отображается как дерево компонентов. Таким образом, если какой-либо компонент изменится, все дерево будет проверено сверху вниз, и все затронутые компоненты будут перерисованы.

Как это работает?

На рисунке ниже желтый компонент изменяется, что приводит к тому, что родительские компоненты помечаются как грязные. Затем запускается Zone.js и инициируется изменение (TICK). Мгновенно каждый компонент в дереве компонентов, помеченный как грязный, будет повторно визуализирован. К сожалению, под этот принцип подпадают даже компоненты, которые не претерпели изменений.

Сигналы, с другой стороны, не запускают обнаружение изменений. Они позволяют вносить мелкие изменения, что делает использование Zone.js излишним.

В будущем мелкие изменения можно будет настраивать с помощью флага в компоненте-декораторе, так что в итоге будет повторно визуализирована только та часть компонента, которая использует сигнал.