this.typeCtrl.valueChanges.subscribe((value) => {
if (value === 'new') {
this.percent = '20';
} else {
this.percent = '10';
}
});
У меня есть подписка с изменением значения элемента formControl, я должен отказаться от подписки или форма делает это по умолчанию?
как? у него нет возможности отказаться от подписки, когда AbstracControl говорит мне: свойство «отписаться» не существует для типа «AbstractControl». ts(2339) @R.Richards
Вам нужно только отписаться от бесконечных наблюдаемых. Так что в этом случае да, вам нужно отписаться. Вам не нужно отписываться от наблюдаемых, которые завершаются, например HTTP-запросы. Это подробно описано здесь: stackoverflow.com/a/41177163/12914833 Возвращаемое значение subscribe()
— это функция, которая отменяет подписку.
вы должны отписаться от каждой подписки в 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();
}
Вы должны проверить документ, если вам нужно отказаться от подписки. Не каждая подписка остается открытой, например. диалог материала после закрытия подписки завершается.
Как сказал в комментариях Р. Ричардс, вы всегда должны отписываться от всего, прежде чем уничтожать какой-либо экземпляр.
Вы упомянули, что не было возможности отказаться от подписки на 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());
}
отписаться, всегда