Le hook de cycle de vie OnDestroy est disponible chez les fournisseurs. Selon la documentation:
Crochet de cycle de vie appelé lorsqu'une directive, un canal ou un service est détruit.
Voici un exemple :
@Injectable()
class Service implements OnDestroy {
ngOnDestroy() {
console.log('Service destroy')
}
}
@Component({
selector: 'foo',
template: `foo`,
providers: [Service]
})
export class Foo implements OnDestroy {
constructor(service: Service) {}
ngOnDestroy() {
console.log('foo destroy')
}
}
@Component({
selector: 'my-app',
template: `<foo *ngIf="isFoo"></foo>`,
})
export class App {
isFoo = true;
constructor() {
setTimeout(() => {
this.isFoo = false;
}, 1000)
}
}
Notez que dans le code ci Service
- dessus se trouve une instance qui appartient au Foo
composant, elle peut donc être détruite lorsqu'elle Foo
est détruite.
Pour les fournisseurs qui appartiennent à l'injecteur racine, cela se produira lors de la destruction de l'application, cela est utile pour éviter les fuites de mémoire avec plusieurs bootstraps, c'est-à-dire lors des tests.
Lorsqu'un fournisseur de l'injecteur parent est abonné au composant enfant, il ne sera pas détruit lors de la destruction du composant, c'est la responsabilité du composant de se désabonner du composant ngOnDestroy
(comme l'explique une autre réponse).
class Service implements OnDestroy
? Et que pensez-vous quand cela est appelé si le service est fourni au niveau du moduleimplements OnDestroy
n'affecte rien mais peut être ajouté par souci d'exhaustivité. Il sera appelé lorsqu'un module est détruit, commeappModule.destroy()
. Cela peut être utile pour plusieurs initialisations d'applications.Créez une variable dans votre service
Poussez chacun de vos abonnés à la baie comme
Ecrire une
dispose()
méthodeAppelez cette méthode depuis votre composant pendant ngOnDestroy
la source
@injectables
Je préfère ce
takeUntil(onDestroy$)
modèle activé par les opérateurs pipables. J'aime le fait que ce modèle soit plus concis, plus propre et qu'il exprime clairement l'intention de tuer un abonnement lors de l'exécution duOnDestroy
hook de cycle de vie.Ce modèle fonctionne pour les services ainsi que les composants souscrivant à des observables injectés. Le code squelette ci-dessous devrait vous donner suffisamment de détails pour intégrer le modèle dans votre propre service. Imaginez que vous importez un service appelé
InjectedService
...Le sujet de quand / comment se désabonner est couvert en détail ici: Angular / RxJs Quand dois-je me désinscrire de `Subscription`
la source
Juste pour clarifier - vous n'avez pas besoin de détruire
Observables
mais seulement les abonnements qui leur sont faits.Il semble que d'autres aient souligné que vous pouvez désormais également utiliser
ngOnDestroy
des services. Lien: https://angular.io/api/core/OnDestroyla source
Attention si vous utilisez des jetons
En essayant de rendre mon application aussi modulaire que possible, j'utiliserai souvent des jetons de fournisseur pour fournir un service à un composant. Il semble que ceux-ci n'obtiennent PAS leurs
ngOnDestroy
méthodes appelées :-(par exemple.
Avec une section fournisseur dans un composant:
My
ShopPaymentPanelService
n'a PAS sangOnDestroy
méthode appelée lorsque le composant est supprimé. Je viens de découvrir cela à la dure!Une solution de contournement consiste à fournir le service conjointement avec
useExisting
.Quand j'ai fait cela, le a
ngOnDispose
été appelé comme prévu.Je ne sais pas si c'est un bug ou pas mais très inattendu.
la source