自定义磁贴本身是一个自由式 SAPUI5 应用程序。在该应用程序中,我调用一项服务来反映图块上的数字。例如,SOLPED 图块具有“1”。当我单击此图块时,它会导航到其关联的应用程序,当我单击主应用程序内的导航后退箭头时,它会导航回启动板。
启动板图块上的数字可能会由于用户在各自主应用程序内的操作而发生变化;那么,从主应用程序导航回来时,有什么方法可以处理自定义磁贴中对我的服务的新函数调用吗?
我尝试过的是:
1- 使用路由处理导航
Manifest.json
"routes": [
{
"name": "RouteTileSolped",
"pattern": ":?query:",
"target": [
"TargetTileSolped"
]
}
],
"targets": {
"TargetTileSolped": {
"viewType": "XML",
"transition": "slide",
"clearControlAggregation": false,
"viewId": "ViewTileSolped",
"viewName": "View1"
}
}
View1.controller.js
//Inicializar Routing
onInit: function(){
...
let oRouter = sap.ui.core.UIComponent.getRouterFor(this);
oRouter.getRoute("RouteTileSolped").attachPatternMatched(this._onNavBack, this);
},
_onNavBack: function(){
console.log("NAVBACK!!! ROUTING!!!");
},
单击导航后退按钮后,它不会控制台日志。
2-使用ShellUIService
View1.controller.js
onBeforeRendering: async function(){
//Sobreescribir función de navegación hacia atrás
this.getOwnerComponent().getService("ShellUIService").then(function(oShellService) {
oShellService.setBackNavigation(function() {
console.log("NAVBACK!!! LAUNCHPAD!!!");
});
});
}
这种工作方式......它在导航回来时控制台记录,但只是在主应用程序中,我需要的是在自定义磁贴中拥有一个处理程序。
我不知道我所做的是否是错误的,或者是否有其他方法来解决这个问题。
一段时间后我发现了如何做到这一点...
每当您想要处理 UI5 中的任何导航相关事件时,都必须使用路由器对象,如 UI5 文档中所述 (https://sapui5.hana.ondemand.com/sdk/#/topic/3d18f20bd2294228acb6910d8e8a5fb5)
要恢复它,路由器对象在用户会话期间在所有启动板的应用程序中都处于活动状态。它侦听 URL 更改并将其与活动应用程序的清单路由进行比较,寻找匹配项。如果没有匹配,则会触发 bypassed 事件。
因此,如果您从应用程序导航回启动板的主页视图,路由器将发生变化,因此会寻求匹配,从而触发绕过的事件。
要处理此事件,在您的自定义磁贴应用程序中,您必须:
1-启动应用程序时创建路由器对象:
onInit: function(){
...
let oRouter = sap.ui.core.UIComponent.getRouterFor(this);
...
}
2- 为绕过事件添加句柄:
{
...
oRouter.attachBypassed(this.onBackFromApp, this);
},
onBackFromApp: function(oEvent){
if (oEvent.getParameter("hash") === "Shell-home"){
this.actualizarNumeroDeDocumentos();
}
}
只要路由器的哈希值为“Shell-home”(与启动板的 home 相同),这将使应用程序触发 onBackFromApp() 函数。