export class TestComponent { ngOnInit() { this.form = new FormGroup({...}); this.valueChanges = this.form.valueChanges.subscribe(console.log); this.statusChanges = this.form.statusChanges.subscribe(console.log); } ngOnDestroy() { this.valueChanges.unsubscribe(); this.statusChanges.unsubscribe(); } }
form control中同理html
export class TestComponent { constructor(private route: ActivatedRoute, private router: Router) { } ngOnInit() { this.route.params.subscribe(console.log); this.route.queryParams.subscribe(console.log); this.route.fragment.subscribe(console.log); this.route.data.subscribe(console.log); this.route.url.subscribe(console.log); this.router.events.subscribe(console.log); } ngOnDestroy() { // You should unsubscribe from each observable here } }
根據官方文檔,Angular應該自動unsubscribe,但這裏面有個bug。git
export class TestComponent { constructor(private renderer: Renderer2, private element : ElementRef) { } ngOnInit() { this.click = this.renderer.listen(this.element.nativeElement, "click", handler); } ngOnDestroy() { this.click.unsubscribe(); } }
export class TestComponent { constructor(private element : ElementRef) { } interval: Subscription; click: Subscription; ngOnInit() { this.interval = Observable.interval(1000).subscribe(console.log); this.click = Observable.fromEvent(this.element.nativeElement, 'click').subscribe(console.log); } ngOnDestroy() { this.interval.unsubscribe(); this.click.unsubscribe(); } }
export class TestComponent { constructor(private store: Store) { } todos: Subscription; ngOnInit() { this.todos = this.store.select('todos').subscribe(console.log); } ngOnDestroy() { this.todos.unsubscribe(); } }
@Component({ selector: 'test', template: `<todos [todos]="todos$ | async"></todos>` }) export class TestComponent { constructor(private store: Store) { } ngOnInit() { this.todos$ = this.store.select('todos'); } }
當組件被銷燬時,async
管道自動取消訂閱,以免潛在的內存泄漏。es6
export class TestDirective { @HostListener('click') onClick() { .... } }
當你有一個有限的序列,一般你不須要unsubscribe
,例如當使用HTTP
service或timer
observable。github
export class TestComponent { constructor(private http: Http) { } ngOnInit() { Observable.timer(1000).subscribe(console.log); this.http.get('http://api.com').subscribe(console.log); } }
不要過多的調用unsubscribe
方法,RxJS: Don’t Unsubscribeapi
takeUntil
它發出源 Observable 的值,而後直到第二個 Observable (即 notifier )發出項,它便完成。async
export class TestComponent { constructor(private store: Store) { } private componetDestroyed: Subject = new Subject(); todos: Subscription; posts: Subscription; ngOnInit() { this.todos = this.store.select('todos').takeUntil(this.componetDestroyed).subscribe(console.log); this.todos = this.store.select('posts').takeUntil(this.componetDestroyed).subscribe(console.log); } ngOnDestroy() { this.componetDestroyed.next(); // componetDestroyed 發出值後,todos,todos會completed this.componetDestroyed.unsubscribe(); } }