Полное поведение

Я использую BehaviorSubject и подписываюсь на него с помощью асинхронного канала. Нужно ли мне завершать BehaviorSubject при уничтожении компонента? * Я не подписываюсь на это в файле .ts

Async pipe автоматически отпишется, Подробнее об этом можно прочитать здесь: angular.io/api/common/AsyncPipe#description

Chellappan வ 11.05.2023 06:33
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
3
1
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы получаете доступ к теме поведения с помощью асинхронного канала, в этом случае вам не нужно вручную отменять подписку на эту тему в вашем файле .ts, angular автоматически отпишется для вас, когда определенный компонент будет уничтожен.

Однако, если вы вручную подписываете тему в файл .ts вашего компонента, только в этом случае вам придется вручную отписаться от хука жизненного цикла вашего компонента ngOnDestroy(), чтобы избежать ошибок утечки памяти.

Надеюсь, ты получишь ответ, Спасибо!

Ответ принят как подходящий

complete() делает 2 вещи:

  1. отправляет сигнал завершения своим подписчикам, который запускает их обратные вызовы завершения
  2. отписывает всех текущих подписчиков и предотвращает подписку новых

Поэтому, если вы используете только BehaviorSubject в своем компоненте и используете его только через канал async, который автоматически управляет своими базовыми подписками (запускает подписку, как только ее шаблон выполняется, останавливает подписку, когда компонент вот-вот будет уничтожен), Вам не нужно звонить complete().

Однако, если этот BehaviorSubject существует в общей службе и/или используется несколькими подписчиками, вызов complete() может быть либо ошибкой, поскольку вы выполните его для всех подписчиков, а не только для своего компонента. Или, в зависимости от ваших потребностей, это может понадобиться, если вы действительно хотите полностью очистить BehaviorSubject.


Подводя итог, думаю, имеет смысл

  • позвоните complete(), где Тема поделилась, или вы заботитесь о событии завершения, и
  • не называть его там, где субъект является «приватным» для вашего класса, вас не волнует событие завершения, и вы убедитесь, что отменяете подписку на все свои подписки, что звучит как множество условий, но обычно имеет место для большинства компонентов

вы можете использовать complete() в ngOnDestroy()

ngOnDestroy() {
 this.subject.complete();
}

Другие вопросы по теме