8

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

我试图通过返回一个 observable 来做到这一点,但它不起作用。

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

当我在 if 块中执行 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();
}
4

3 回答 3

7

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

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

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

于 2016-07-22T10:33:09.580 回答
1

只是把这个放在这里,以防将来有人像我一样粗心:

如果你的组件有一个函数,hasUnsavedChanges()你的canDeactivate()方法就需要返回!hasUnsavedChanges().

但是,如果您开始使用 observable for hasUnsavedChanges,您将返回!hasUnsavedChanges$一个错误值。

如果您需要同时支持两者,您可以这样做:

canDeactivate(component: C)
{
    var hasUnsavedChanges = component.hasUnsavedChanges();

    if (typeof (hasUnsavedChanges) === 'boolean')
    {
        return !hasUnsavedChanges;
    }
    else
    {
        return hasUnsavedChanges.map(x => !x);
    }
}
于 2018-02-16T08:44:00.023 回答
1

它不适合我,因为我使用BehaviorSubject的是初始值null

确保通过以下方式创建 Observable Subject

private modalConfirmation = new Subject<boolean>();
public getModalSelectionObservable(): Observable<boolean> {
    return this.modalConfirmation.asObservable();
}
于 2020-11-03T12:48:27.573 回答