angular - canDeactivate 中的返回 Observable 不起作用

标签 angular angular2-router3

我有一个确认/取消模式对话框,当用户离开路线时弹出。我通过使用带有 canDeactivate 方法的守卫来做到这一点。但是,我希望 canDeactivate 等到它从模态返回任何内容之前得到响应。

我试图通过返回一个可观察对象来做到这一点,但它不起作用。

canDeactivate(): Observable<boolean> | boolean {
    if(this.isFormStarted()) {
        this.formService.showExitModal(true);
        return this.formService.getModalSelectionObservable();
    }
    else {
        return true;
    }
}

当我在 if block 中执行 console.log 时,即使我可以看到 observable 工作正常,但当我点击确认时什么也没有发生

this.formService.getModalSelectionObservable().subscribe(
        value => console.log("dialog value: " + value)
    );

这是表单服务的样子。

private modalConfirmation = new Subject<boolean>();

public setModalSelectionObservable(confirmLeave: boolean) {
    this.modalConfirmation.next(confirmLeave);
}
public getModalSelectionObservable(): Observable<boolean> {
    return this.modalConfirmation.asObservable();
}

最佳答案

使用take(1)first()(不要忘记导入)

return this.formService.getModalSelectionObservable().first();

确保 observable 在第一个事件后关闭,否则路由器将等待直到它从服务中关闭。

关于angular - canDeactivate 中的返回 Observable 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38524161/

相关文章:

angular - 如何通过 routerLink 指令指定查询参数

angular - 使用嵌套模块的路由应该如何在 Angular 2 中工作?

angular - 如何在 Angular2 rc3 路由中处理来自 oauth 重定向 url 的哈希片段

javascript - 通过单击 IFrame(内联框架)中的项目,我需要路由到特定的 URL

html - 滚动到元素的最佳方法

css - 在组件中使用 CSS 动画显示和隐藏

html - 如何防止组件内容重叠?

angular - 我是否必须取消订阅 ActivatedRoute(例如 params)可观察量?

angular - rxjs 的条件发射延迟

angular - startWith ('' ) typescript 代码有什么作用?