Code snippets
take-until-destroy.decorator.tsimport { Subject } from 'rxjs';
/**
* @description
* TakeUntilDestroy decorator is used to unsubscribe when the component destroys.
* @returns () => Observable<unknown>
*
* @usageNotes
* @TakeUntilDestroy() componentDestroy!: () => Observable<unknown>;
*
* ngOnInit(): void {
* console.log('AboutComponent');
* interval(500).pipe(
* takeUntil(this.componentDestroy()),
* ).subscribe(e => {
* console.log(e);
* });
* }
*/
export function TakeUntilDestroy() {
return function (target: any, key: string) {
const originalDestroy = target.ngOnDestroy;
if (typeof originalDestroy !== 'function') {
console.warn(`${target?.constructor?.name} is using @TakeUntilDestroy but does not implement OnDestroy`);
}
target[key] = function (): object {
this._takeUntilDestroy$ = this._takeUntilDestroy$ || new Subject();
return this._takeUntilDestroy$.asObservable();
};
target.ngOnDestroy = function (...args: any): void {
if (typeof originalDestroy === 'function') {
originalDestroy.apply(this, args);
}
if (this._takeUntilDestroy$) {
this._takeUntilDestroy$.next();
this._takeUntilDestroy$.complete();
}
};
}
}
References
Tags:
angular