我怎样才能获得当前路线?

时间:2017-02-19 09:05:30

标签: sapui5

无论如何我可以获得当前的路线名称吗?有getRoute函数但我必须自己传递路由名称。如果有办法从控制器中的路由器对象获取所有路由的名称,它对我有帮助。例如:

this.getRouter().getRoutes()

有一个函数getViews,但我找不到相同的路径。

4 个答案:

答案 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)

自1.75版起

自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


1.46.1和1.74之间

  1. 在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());
      },
    
      // ...
    });
    
  2. 控制器中的任何位置(甚至在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

似乎对我有用。