Зачем использовать Subject или BehaviorSubject в сервисах, если angular может определять последние значения?

Например, у нас есть сервис, в котором есть список элементов. Когда мы изменяем этот список в службе, все компоненты, которые используют этот список, обнаружат это изменение. например, если вы добавите новый элемент, все компоненты его обнаружат. Так почему мы должны использовать Subject или BehaviorSubject, если angular может сам обнаруживать изменения?


person Ali Rezaali    schedule 23.02.2021    source источник
comment
Если данные ограничены одним компонентом, то (почти) нет необходимости в наблюдаемых. Однако, если данные необходимо разделить между несколькими компонентами, они хранятся в одноэлементных службах. А компоненты не имеют возможности узнать состояние данных в службе. Таким образом, наблюдаемые используются, чтобы сообщить компонентам, что состояние данных было изменено.   -  person Michael D    schedule 24.02.2021


Ответы (3)


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

Если изменение идет вниз по дереву компонентов, вы можете сделать это, используя @Input. Но что, если вам нужно общаться сбоку, вверх или независимо от формы дерева? Будучи ограниченным однонаправленным потоком данных, обнаружение угловых изменений не может с этим помочь, поэтому вам нужен другой способ распространения изменений для этого. И это то, для чего Observables.

person meriton    schedule 23.02.2021

Шаблон создания службы с _1 _ / _ 2_ в основном используется для передачи данных между компонентами, у которых отсутствует прямое соединение. Для прямого соединения я имею в виду два компонента, которые не имеют никакого отношения, такие как родитель / дети, братья и сестры, внуки.

Представьте, что у вас есть два компонента, которым необходимо обмениваться данными без прямого подключения. Как бы вы передавали данные между этими компонентами (поскольку вы не можете использовать Input(), Output() + EventEmitter, ViewChild(), ViewChildren())? Как один компонент узнает об изменении свойства другого компонента?

По этой причине мы создаем службу с субъектом / поведением Subject (с этого момента мы будем просто называть ее Subject). Каждый компонент, который необходимо обновить до последней версии, внедрит эту услугу и subscribe() в субъект. Таким образом, когда мы next() значение в Subject, каждый компонент, подписанный на Subject, получит последнее излучение. Когда Subject излучает, вы можете запустить некоторую логику (например, назначить излучение свойству компонента или запустить некоторые методы компонента с этим излучением в качестве аргумента).

Только если компоненты имеют прямое соединение, ваш вопрос законен:

Зачем использовать Subject или BehaviorSubject в сервисах, если angular может определять последние значения?

В этом случае нет ничего плохого в том, чтобы просто использовать @Input() и @Output() + EventEmitter для передачи данных между компонентами. Но вы все равно можете реализовать шаблон службы + Subject, если, например, родительский компонент должен поделиться данными со своими пра-пра-внуками. Возможно, вы захотите избежать передачи данных между двумя компонентами, когда один из них очень глубоко вложен. Вам нужно будет следовать за всей цепочкой компонентов с @Input() и @Output() + EventEmitter столько раз, сколько раз количество вложенных компонентов. В этом случае вы можете просто воспользоваться услугой + Subject, чтобы получить более чистый конечный результат.

person GBra 4.669    schedule 23.02.2021

Вы можете использовать Subject, BehaviorSubject, EventEmitter или что угодно для достижения цели. Кто заставляет вас использовать именно Subject или BehaviorSubject? Если вы спрашиваете о ChangeDetectionStrategy - вы сбиваете с толку концепции, и вам следует пройти курс по Angular, потому что ChangeDetectionStrategy касается входов (@Input () something: string) в компонентах и ​​их изменениях.

person hersir1    schedule 23.02.2021