2017-08-11 95 views
2

這可能是一個基本問題,但沒有找到足夠的答案。所以這就是爲什麼我想創建一個SO。Angular 2 RxJS在submitForm上可觀察取消訂閱

我有一個提交處理程序的表單。

<form class="form login" [formGroup]="loginForm" (ngSubmit)="onSubmit()" novalidate> 

在提交我調用哪個預訂可觀察到的一個功能,即執行HTTP調用火力(使用AngularFire2庫)。

public onSubmit() : void { 
    const values = this.loginForm.value; 

    let subscription = this.loginUsernamePassword(values.email, values.password).subscribe((data) => { 
     this.processLogin(data); 
    }, (error) => { 
     console.log("erreur" + error); 
    },() => { 
     console.log("one"); 
    }); 
} 

現在假設我多次提交表單,然後創建多個訂閱。我關心的是數據清理(取消訂閱),但不知道處理這個問題的最佳方法是什麼,特別是因爲這是一次性功能。我看到兩個解決方案。

1)將訂閱存儲在訂閱集合中,當組件被移除時,該集合被銷燬'ngOnDestroy'。但是我認爲對於這種情況:單個HTTP調用,這有點奇怪。

2)oberservable完成後立即退出。

3)..其他?

感謝您的幫助和提示。在一個組件處理長期訂閱

+0

我強烈建議您閱讀Ben Lesh [「RxJS:不要取消訂閱」](https://medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87) –

回答

2

的一種方法是,以確保他們加入的條件認購,像這樣設...

export class MyClass implements OnInit, OnDestroy { 
    public isDestroyed = false; 
    public someData: Observable<SomeData>; 

    public ngOnInit() { 
    this.someData = {some other source} 
    .takeWhile(!this.isDestroyed) 
    .subscribe(x => x...........); 
    } 

    public ngOnDestroy() { 
    this.isDestroyed = true; 
    } 
} 

雖然我懷疑父母觀察到可能舉行直到傳遞next值,然後發現用戶不再感興趣。使用takeUntil可能會更好,因爲這需要一個Observable,您可以調用next來立即終止訂閱。

在你的情況下,它確實取決於this.loginUsernamePassword的作用。如果它是基於http調用的訂閱,那麼由http創建的主題將被銷燬,然後您的本地訂閱將隨之消失。