启用路由

学习目标

  • 在应用程序描述符中创建初始路由配置

路由概览

SAPUI5 提供基于哈希的导航,允许您构建单页应用,其中的导航通过更改哈希来完成。这样,浏览器无需重新加载页面。

基于哈希的导航支持书签以及指向应用内部页面的深层链接;这意味着您可以启动应用并恢复已添加书签的状态。

观看此视频,了解路由的原理。

视频:本节含 SAP 官方视频(视频 ID 1_lvbqxwdf),需在 learning.sap.com 在线观看。

路由配置

在应用程序描述符中,路由配置位于 sap.ui5 命名空间的 routing 属性中。它由以下三个部分组成:configroutestargets

示例路由配置,如下文所述。

config 部分包含全局路由器配置以及适用于所有路由和目标的默认值。

在所示示例中,使用属性 viewTypeviewPath 来指定默认情况下所使用的所有视图均为 XML 类型,并且所使用的视图名称带有前缀 sap.training.exc.view。这意味着,稍后在定义目标时,只需指定 Overview 作为视图名称即可,例如,以便将 XML 视图 sap.training.exc.view.Overview 唯一标识为目标视图。

routerClass 属性定义了使用哪个路由器。routerClass 的可能值为 sap.ui.core.routing.Routersap.m.routing.Router 以及 sap.ui.core.routing.Router 的任何其他子类。与 sap.ui.core.routing.Router 相比,sap.m.routing.Router 针对移动应用进行了优化,因为它不仅加载目标并将其放入相应的容器中,还会在导航期间触发动画。以下动画可供使用,可通过 transition 属性设置:slide(默认)、flip、fade 和 show

controlId 属性确定用作插入目标视图或组件的父级的控件。controlAggregation 属性定义了该控件的聚合,视图或组件将添加至该聚合。

async 属性定义目标是否以异步方式加载。

示例路由配置,突出显示路由和目标。

每个路由定义名称、模式以及可选的一个或多个目标,当路由匹配时导航到这些目标。该模式用于确定与该路由匹配的浏览器哈希。指定的目标必须在 targets 部分中定义。

目标定义要显示的视图或组件。它与一个或多个路由相关联,也可以在应用内部手动显示。每当显示目标时,都会加载相应的视图或组件,并将其添加到指定控件(controlId 属性)的指定聚合(controlAggregation 属性)中。

使用目标的 viewLevel 属性,您可以定义导航方向。例如,从较低视图层级导航到较高视图层级会导致前进导航。这对于 flip 和 slide 过渡尤为重要,因为 slide 动画应从左到右或反之。

在所示示例中,定义了一个名为 overview 的路由,如果浏览器哈希为空,则显示名为 overview 的目标。overview 目标加载 XML 视图 sap.training.exc.view.Overview

初始化路由器

路由器需要由组件初始化。为此,请在 Component.js 组件控制器的 init 方法中获取对路由器的引用,并在其上调用 initialize 方法。

初始化路由器。以下代码已突出显示:this.getRouter() .initialize();

初始化后,manifest.json 中的路由配置会在应用程序中自动启用:将评估当前 URL,并自动显示相应的视图。

配置路由

业务场景

在以下练习中,该场景将通过一个导航选项进行扩展:当用户在客户表中选择一个客户时,将显示一个包含所选客户详细信息的新视图。

为了实现此导航,您必须调整应用程序的结构:到目前为止,组件一直使用 App 视图作为根视图,而该视图又包含一个 App UI 元素,Overview 被静态嵌入其 pages 聚合中。然而,对于导航而言,视图在 pages 聚合中的嵌入必须以动态方式完成。导航的实现方式是:通过路由器在 pages 聚合中交换视图。

在本练习中,您将首先重构应用程序,使 Overview 视图不再静态嵌入 App UI 元素的 pages 聚合中,而是通过路由配置动态嵌入。在接下来的练习中,您将在此基础上实现实际的导航。*模板:*Git 仓库:https://github.com/SAP-samples/sapui5-development-learning-journey.git,分支:*sol/21_OData_model_(create)模型解决方案:*Git 仓库:https://github.com/SAP-samples/sapui5-development-learning-journey.git,分支:sol/22_routing_configuration

任务 1:从 App UI 元素的 pages 聚合中移除 Overview 视图

步骤

  1. 在编辑器中打开 *webapp/view* 文件夹中的 *App.view.xml* 文件。

  2. 删除视图实现中的以下行,以移除 Overview 视图在 App UI 元素的 pages 聚合中的静态嵌入:

<pages>
<mvc:XMLView viewName="sap.training.exc.view.Overview"/>
</pages>

结果

App 视图现在应如下所示: App.view.xml 的屏幕截图,如文中所述。 3. 将 id="app" 属性添加到 <App> 标签,为 App UI 元素设置 Id。

注意

该 Id 稍后将在路由配置中使用,以将 App UI 元素指定为插入视图的父级。

结果

App 视图现在应类似于以下内容:

XML 文件,其中突出显示 id=app。

任务 2:在应用程序描述符中配置路由

步骤

  1. 在编辑器中打开 *webapp* 文件夹中的 *manifest.json* 应用程序描述符。

  2. 在应用程序描述符中,查找 sap.ui5 命名空间中的 routing 属性:

"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"async": true,
"viewPath": "sap.training.exc.view",
"controlAggregation": "pages",
"controlId": "<...>"
},
"routes": [],
"targets": {}
}

注意

以下三个属性 config、routes 以及 targets 在 routing 部分中定义了应用程序的路由和导航结构。

  1. controlId 属性的 "<...>" 值替换为 "app",即上面为 App UI 元素分配的 Id。

注意

根据此配置,路由器现在会将视图添加到 pages 聚合,该聚合属于 App UI 元素。

结果

路由配置现在应如下所示: manifest.json 文件,突出显示 controlId。 4. 现在,将以下对象添加到 routes 数组:

{
"name": "overview",
"pattern": "",
"target": [
"overview"
]
}

注意

这定义了一个名为 overview 的路由,当浏览器哈希为空时,将显示名为 overview 的目标。所引用的 overview 目标将在下一步中定义。

结果

路由配置现在应如下所示: 生成的路由配置代码的屏幕截图。 5. 最后,将以下属性添加到 targets 对象:

"overview": {
"viewId": "overview",
"viewName": "Overview",
"viewLevel": 1
}

注意

这定义了上文引用的 overview 目标将用于加载 Overview 视图。

结果

路由配置现在应如下所示:

manifst.json 文件,突出显示 targets 属性。

任务 3:初始化路由器

步骤

  1. 在编辑器中打开 *webapp* 文件夹中的 *Component.js* 文件。

  2. 将以下代码添加到组件控制器的 init 方法末尾:

// enable routing
this.getRouter().initialize();

注意

上面完成的路由配置会使路由器在浏览器哈希为空时将 Overview 视图加载到 pages 聚合,该聚合属于 App UI 元素。要为应用程序启用此配置,需在此处初始化路由器。

结果

组件控制器的初始化方法现在应如下所示: 生成的 Component.js 文件的屏幕截图。 3. 通过从 SAP Business Application Studio 启动应用程序来进行测试运行。

小心

如果您未连接到后端系统,请使用 start-mock npm 脚本启动应用程序。 确保从用户角度看,应用程序的运行没有变化:浏览器中显示 Overview 视图。但是,与之前的实现不同,Overview 视图现在通过路由嵌入到 pages 聚合,该聚合属于 App UI 元素。

  1. 右键单击 sapui5-development-learning-journey 项目中的任意子文件夹,然后从出现的上下文菜单中选择 Preview Application

  2. 在出现的对话框中选择名为 start-mock 的 npm 脚本。

  3. 在打开的应用程序中,检查组件是否按预期工作。