2016-12-28 102 views
3

下面是什麼我問我一個簡單的例子:Angular 2 - 訂閱FormControl的valueChanges是否需要退訂?

class AppComponent { 

    someInput: FormControl = new FormControl(''); 
    private subscription: Subscription; 

    constructor(){ 

    this.subscription = this.someInput.valueChanges 
     .subscribe(() => console.log("testing")); 
    } 
} 

我有2個問題:

1)我必須最終從這個退訂? 2)最重要的是,無論答案是否定#1,爲什麼答案是?

任何有識之士將不勝感激!

謝謝!

回答

2
  1. 是的。
  2. 對於無論訂閱的東西,您需要退訂以防止內存泄漏。有幾種方法可以取消訂閱。 a。 「N次後自動取消訂閱」 - 添加.take(numberOfTimes)將在您指定的N次後取消訂閱。例如:

    this.subscription = this.someInput.valueChanges 
        .take(2) // unsubscribe after 2 times 
        .subscribe(() => console.log("testing")); 
    

    b。期間ngOnDestroy()

+1

IMO最好的方式是與[takeUntil](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-takeUntil) –

+0

取決於情況。如果知道了時間的數量,那麼取(n),如果知道動作結束直到某個場景或動作,則takeUnitl() – Chybie

+1

如果使用take(n)或takeUntil(),如果用戶離開視圖之前會發生什麼Observable有機會自動回覆並取消訂閱。在銷燬中使用取消訂閱會不會更安全? – Thibs

3

組件的生命週期期間手動取消訂閱,通常有一個相對簡單的方法來設置自動取消訂閱。

的RxJS方法是使用takeUntil - 它基本上可以讓你設置一個用戶這使聽,直到你告訴它不要 :)

首先我們需要在部件的破壞主題:

private destroy$ = new Subject(); 

然後告訴它散發出的值,當我們的組件被破壞:

ngOnDestroy(){ 
    this.destroy$.next(); 
    } 

現在SETU p您的訂閱使用它:

this.someInput.valueChanges 
    .debounceTime(1000) 
    .distinctUntilChanged() 
    .takeUntil(this.destroy$) 
    .subscribe (newValue => { 

所有這樣的訂閱設置,然後將自動退訂,當他們收到銷燬通知。

這是特別有用的,例如,如果你有一個ngFor動態添加控件,並且每個添加的控件都有一個valueChanges訂閱(例如一個控件數組)。在這種情況下,您不需要在ngOnDestroy中遍歷數組並逐個取消訂閱。只需使用takeUntil :)

我建議您閱讀Ben Lesh's article(Google的RxJS首席工程師),以瞭解takeUntil的大概情況,包括優缺點。