如何覆盖路由并重定向到 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。
也许,从性能的角度来看,这不是最佳解决方案,因为它可能会导致不需要的渲染,但这是我发现防止用户被路由到不需要的视图的唯一方法。
给定基于 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。
也许,从性能的角度来看,这不是最佳解决方案,因为它可能会导致不需要的渲染,但这是我发现防止用户被路由到不需要的视图的唯一方法。