2017-06-14 57 views
0

我正試圖return從另一個observable的訂閱中獲得布爾值。然而,我不能讓return泡泡到父方法。在子訂閱中返回parent observable

我知道我是return在訂閱的上下文中,但我如何告訴canDeactivedialog.result.subscibe訂閱完成並且能夠返回布爾值?

canDeactivate(): Observable<boolean> | Promise<boolean> | boolean { 
    const settings: DialogSettings = { 
     title: 'Please confirm', 
     content: 'Are you sure want to leave without saving your changes?', 
     actions: [ 
     { text: 'No'}, 
     { text: 'Yes', primary: true } 
     ] 
    }; 

    if (!this.isSaved && this.updatedPositions.length) { 
     // return confirm('Do you want to discard the changes?'); 



     const dialog: DialogRef = this.dialogService.open(settings); 

     dialog.result.subscribe((result: DialogResult) => { 

     if (!(result instanceof DialogCloseResult) && result['text'] === 'Yes') { 
      console.log('action', result); 
      console.log('returning false'); 
      return false; 

     } else { 
      console.log('dialog.close()'); 
      dialog.close(); 
      return true; 
     } 

     }) 

    } else { 
     console.log('else'); 
     return true; 
    } 

    } 

回答

2
dialog.result

類似於從這明顯着反映到主要方法回調返回一個異步call.Its。實際上,您在true部分通話中沒有返回任何內容。

不要訂閱更改,照原樣返回可觀察值。使用地圖來轉換數據。

return dialog.result.map((result: DialogResult) => { 

    if (!(result instanceof DialogCloseResult) && result['text'] === 'Yes') { 
     console.log('action', result); 
     console.log('returning false'); 
     return false; 

    } else { 
     console.log('dialog.close()'); 
     dialog.close(); 
     return true; 
    } 

    }) 

並保持它一致,在主要的其他部分,在最底部。返回一個Observable。

} else { 
    console.log('else'); 
    return Observable.of(true); 
}