无论如何我可以获得当前的路线名称吗?有getRoute
函数但我必须自己传递路由名称。如果有办法从控制器中的路由器对象获取所有路由的名称,它对我有帮助。例如:
this.getRouter().getRoutes()
有一个函数getViews
,但我找不到相同的路径。
答案 0 :(得分:7)
不像看起来那么简单,尽管它仍然可能没有任何第三方解决方案。
我们假设路由(在manifest.json中)是:
"routes": [
{
"pattern": "",
"name": "Main",
"view": "main",
"targetAggregation": "pages"
},
{
"pattern": "create",
"name": "Create",
"view": "myView",
"targetAggregation": "pages"
},
{
"pattern": "edit/{id}",
"name": "Edit",
"view": "myView",
"targetAggregation": "pages"
},
{
"pattern": "view/{id}",
"name": "View",
"view": "myView",
"targetAggregation": "pages"
}
]
因此,在这种情况下,您希望获得当前名称:创建,修改或查看。
note 1 :在我的情况下,有一个视图/控制器(“myView”)用于处理三种不同类型的显示器,但无关紧要- 您可以 也有单独的视图/控制器。 (有关详细信息,请参阅 note 2 。)
所以这是为了检索这些路线名称你必须做的事情:
第1步: 在manifest.json
中创建一个全局模型"models": {
"applicationModel": {
"type": "sap.ui.model.json.JSONModel",
"settings": {},
},
}
第2步:
在给定的控制器( myView )中,使用内置 onInit 方法中的路由器 attachRouteMatched 方法:
onInit: function(){
var oRouter = sap.ui.core.UIComponent.getRouterFor(this);
oRouter.attachRouteMatched(this.routeMatched, this);
}
note 2 :如果您有多页应用程序,请在根控制器或component.js中设置事件处理程序。无论你在哪个子页面,这两个都会被加载。
第3步:
在同一个控制器中,主要是直接在 onInit 方法下,创建回调方法(在我的例子中,它叫做 routeMatched ):
routeMatched: function(oEvent){
var oParameters = oEvent.getParameters(),
var sRouteName = oParameters.name; // Yay! Our route name!
var oModel = this.getView().getModel("applicationModel");
oModel.setProperty("/routeName", sRouteName);
}
第4步
现在,只要您可以访问模型,只需将其命名为新属性: routeName 。
this.getView().getModel("applicationModel").getProperty("/routeName");
答案 1 :(得分:3)
自UI5 v1.75起,检索当前路线变得更加容易。
getCurrentRoute: function(router = this.getOwnerComponent().getRouter()) {
const currentHash = router.getHashChanger().getHash();
const { name } = router.getRouteInfoByHash(currentHash); // since 1.75
return router.getRoute(name);
},
API参考:sap.ui.core.routing.Router#getRouteInfoByHash
在Component.js中:
return UIComponent.extend("...", {
metadata: {
manifest: "json",
properties: {
"currentRouteName": {} // default type == "string"
}
},
init: function() {
UIComponent.prototype.init.apply(this, arguments);
this.getRouter().attachBeforeRouteMatched(this.onBeforeRouteMatched, this);
// ...
},
onBeforeRouteMatched: function(event) { // beforeRouteMatched available since 1.46.1
this.setCurrentRouteName(event.getParameter("name"));
},
getCurrentRoute: function() {
return this.getRouter().getRoute(this.getCurrentRouteName());
},
// ...
});
控制器中的任何位置(甚至在onInit
中):
const currentRoute = this.getOwnerComponent().getCurrentRoute();
答案 2 :(得分:2)
我只是扩展了默认路由器: https://gist.github.com/ffleige/1f080e5c0769085569188302b2e12040
要使用它,请替换 manifest.json
中的默认路由器类"routing": {
"config": {
"routerClass": "my.app.MyRouter",
在控制器中使用扩展路由器,如下所示
// get id of current route
var routeId = UIComponent.getRouterFor(this).getCurrentRouteId();
// get current route object
var route = UIComponent.getRouterFor(this).getCurrentRoute();
此解决方案不会暴露对私有成员的访问,并使用openui5 1.44进行测试。
答案 3 :(得分:0)
this.getRouter()._oRoutes
似乎对我有用。