2016-12-28 98 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的大概情况,包括优缺点。