如何覆盖路由并重定向到 UI5 中的另一个视图?

How to override the routing and redirect to another view in UI5?

给定基于 Shop Administration Tool 的简化示例应用程序。在视图之间使用侧边栏导航时,我只显示不同的视图,例如视图 #1、视图 #2 等。这些视图是独立视图,每个视图都有自己的 XML-模板和 JS-控制器。

现在,我想为每个视图添加权限检查,如果用户没有权限,那么他应该被重定向到主视图而不是所需的视图。

我已经实施了导航前检查:

router.attachRoutePatternMatched(async (event) => {

    const targetView = event.getParameters().view.getProperty("viewName");

    const isPermitttedToSeeView = await this.checkUserPermission(targetView);

    if (!isPermitttedToSeeView) {

        MessageToast.show("Sorry, you don't have permissions.");

        router.navTo("mainView");

    }

}, this);

此代码有效,但问题是在没有权限的情况下,用户首先看到 MessageToast 消息(好),然后被重定向到禁止视图(坏),然后立即重定向到 mainView 查看(确定)。

我尝试使用 attachBeforeRouteMatched 代替,希望在这种情况下路由尚未执行,如果需要我可以重定向用户并且用户不会看到禁止的视图。但不是,我仍然看到了一秒钟的禁止视图,然后我被重定向到 mainView.

如何防止重定向到禁止视图并将用户直接转到 mainView 视图?换句话说,如何更改路由导航管道?

可能的解决方法是使用“硬”重定向而不是路由:

mLibrary.URLHelper.redirect("%desiredURL%", false);

其中 mLibrary 通过 "sap/m/library"sap.ui.define 中定义。

这将丢弃任何正在进行的路由,并强制(在用户体验方面,而不是在安全方面)用户被重定向到所需的 URL。

也许,从性能的角度来看,这不是最佳解决方案,因为它可能会导致不需要的渲染,但这是我发现防止用户被路由到不需要的视图的唯一方法。