Если я использую подписку с formControl, я должен отказаться от подписки в ngOnDestroy?

  this.typeCtrl.valueChanges.subscribe((value) => {
    if (value === 'new') {
      this.percent = '20';
    } else {
      this.percent = '10';
    }
  });

У меня есть подписка с изменением значения элемента formControl, я должен отказаться от подписки или форма делает это по умолчанию?

отписаться, всегда

R. Richards 26.10.2022 01:36

как? у него нет возможности отказаться от подписки, когда AbstracControl говорит мне: свойство «отписаться» не существует для типа «AbstractControl». ts(2339) @R.Richards

Jorge Angel 26.10.2022 01:45

Вам нужно только отписаться от бесконечных наблюдаемых. Так что в этом случае да, вам нужно отписаться. Вам не нужно отписываться от наблюдаемых, которые завершаются, например HTTP-запросы. Это подробно описано здесь: stackoverflow.com/a/41177163/12914833 Возвращаемое значение subscribe() — это функция, которая отменяет подписку.

Chris Hamilton 26.10.2022 02:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы должны отписаться от каждой подписки в ngOnDestroy

private _unsubscribeAll = new Subject<void>();



this.typeCtrl.valueChanges.pipe(takeUntil(this._unsubscribeAll)).subscribe((value) => {
  if (value === 'new') {
    this.percent = '20';
  } else {
    this.percent = '10';
  }
});


ngOnDestroy(): void {
  this._unsubscribeAll.next();
  this._unsubscribeAll.complete();
}

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

hmartini 27.10.2022 00:17
Ответ принят как подходящий

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

Вы упомянули, что не было возможности отказаться от подписки на AbstractControl, и это действительно невозможно. Чтобы отписаться, вам нужно сохранить ссылку при подписке.

Я бы порекомендовал вам иметь массив подписок, которые вы перебираете при уничтожении экземпляра, отписываясь от всего. По вашему примеру это будет выглядеть так:

subscriptions = [];

...

const typeCtrlSubscription = this.typeCtrl.valueChanges.subscribe((value) => {
    if (value === 'new') {
      this.percent = '20';
    } else {
      this.percent = '10';
    }
});

this.subscriptions.push(typeCtrlSubscription);

...

ngOnDestroy(): void {
    this.subscriptions.forEach((subscription) => subscription.unsubscribe());
}

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