最近开发SAPUI5 App,客户需求是从一个App跳转到另外一个App的特定页面,并动态绑定指定数据。具体来说,如下图,在第一个App选中一个Internal Order然后点击Edit 或者 Create,页面跳转到第二个App的特定页面来编辑来自第一个App的internal order。
如下是跳转的URL。
#InternalOrder-manageInternalOrder?ControllingArea=00AU&IV_EDIT_MODE=EDIT&InternalOrder=300000&OrderType=Y090&TARGET_CONTENT_AREA=INTERNALORDER_PAGE_INITIAL
#InternalOrder-manageInternalOrder?ControllingArea=00AU&IV_EDIT_MODE=NEW&InternalOrder=&OrderType=&TARGET_CONTENT_AREA=INTERNALORDER_PAGE_INITIAL
我们知道在一个App中跳转需要使用路由和导航功能(Routing & Navigation),多个App之间跳转我们是否也可以使用这个功能呢?
解决方案一:路由和导航功能(Routing & Navigation)
如果对于SAP UI5 Routing & Navigation不熟悉的同学可以访问:https://sapui5.hana.ondemand.com/#/topic/3d18f20bd2294228acb6910d8e8a5fb5
如上图,SAPUI5使用Router来解析URL中的Hash部分,#/之后的部分是Hash,我在SCP上部署App,Hash部分在&/之后。
SAPUI5通过路由模式(Routing Patterns)来解析和导航网络地址,大概意思是一个网址符合一个模式(pattern),路由会通过这个模式Pattern设置的目标targets跳转到指定的页面(或者模块)。
模式(Pattern)可以有各种形式,根据我们这次的需求,我们需要从URL中读出特定的参数parameters,比如:
ControllingArea=00AU
IV_EDIT_MODE=NEW
这里推荐一个验证路由模式的小工具
此解决方案一共分为两步:
第一步:设置manifest.json的routting部分
:?query:
可以匹配我们URL里面的parameters,比如:InternalOrder-manageInternalOrder&/?ControllingArea=00AU&IV_EDIT_MODE=NEW
第二步:
在目标controller里面实现读取parameter的代码,然后根据parameter的值,来判断跳转到哪个页面。
解决方案二:
在controller代码里面直接读取URL中的Hash部分,代码如下:
var sHash = window.location.hash;
然后解析里面的参数,代码如下:
var pieces = sHash.split("?");
if (pieces.length > 1) {
var params = pieces[1].split("&");
for (var i = 0; i < params.length; i++ ) {
var pair = params[i].split("=");
var key = pair[0];
var valueofparam = pair[1];}
两种解决方案虽然差别不大,但是需要对SAPUI5的routing&Navigation有比较深入的理解,所以深入开发SAPUI5应用不仅仅会使用模板创建App,也需要对框架有进一步的理解。