2017-03-31 111 views
1

在我的canDeactivate()路徑守衛中,我調用了一個有兩個按鈕的模式:ok和cancel。如果點擊ok按鈕,我想返回true,以便用戶可以繼續離開頁面,如果點擊取消按鈕,則返回false。這裏是我當前的代碼:在canDeactivate中處理兩個可觀察對象

canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> { 
    let can = component.canDeactivate(); 
    //let result = new Observable<boolean>(); 
    let okResult = new Observable<boolean>(); 
    let cancelResult = new Observable<boolean>(); 

    if (!can) { 
     component.myChangesModal.show('Warning', 'You are about to leave this page with unsaved changes.'); 

     okResult = component.myChangesModal.okEvent.map(() => true); 
     //okResult.subscribe(); 

     cancelResult = component.myChangesModal.cancelEvent.map(() => false); 
     //cancelResult.subscribe(); 
     console.log(okResult); 
     console.log(cancelResult); 

     const observablesArray = [okResult, cancelResult]; 

     let result = Observable.combineLatest.apply(this, observablesArray).take(1); 
     result.subscribe(); 

     return result; 
    } 
    return true; 
    } 

最初測試了這一點的時候,我只有一個單一的觀察到的,檢查時確定按鈕被調用,然後將訂閱的,並返回結果。這工作,但它只適用於一個按鈕,每當點擊取消按鈕,這打破了一切。這是我最初的工作,只有一個按鈕完美。

canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> { 
    let can = component.canDeactivate(); 
    let result = new Observable<boolean>(); 

    if (!can) { 
     component.myChangesModal.show('Warning', 'You are about to leave this page with unsaved changes.'); 

     result = component.myChangesModal.okEvent.map(() => true); 
     result.subscribe(); 

     return result; 
    } 
    return true; 
    } 

當我試圖讓我的canDeactivate模式與多個observable一起工作時,我該做什麼錯誤,我應該怎麼做?

回答

4

CombineLatest會一直等到兩個觀測值發出一個值。這從來沒有發生你的情況。您需要改爲Observable.merge

return okResult.merge(cancelResult).take(1) 

return Observable.merge(okResult, cancelResult).take(1) 
+0

'merge'將在這裏工作,也有'Observable.race',其行爲在這種情況下非常相似。 –

相關問題