You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BTP Fiori Launchpad自定义应用返回导航与Tile数据刷新方案问询

从主应用返回Launchpad时触发自定义Tile数据更新

问题背景

我有一个由4个自定义Tile组成的Launchpad,每个Tile都是独立的Freestyle SAPUI5应用。Tile会调用后端服务展示数字(比如SOLPED Tile显示“1”),点击Tile可跳转到关联的主应用,主应用内点击返回箭头回到Launchpad。需要实现:用户在主应用操作后返回Launchpad时,自动触发Tile的服务调用更新数字。

已尝试的方案及问题

方案1:路由事件监听

在Tile应用的Manifest.json配置路由,控制器onInit中绑定路由匹配事件,但返回时无日志输出。

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!!!");
},

问题:路由匹配事件仅在Tile应用内部导航时触发,跨应用返回Launchpad的场景不适用,因此无日志输出。

方案2:ShellUIService重写返回逻辑

在Tile应用的onBeforeRendering中设置ShellUIService的返回导航函数,但返回时日志在主应用输出,Tile应用无反应。

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!!!");
        });                
    });
}

问题:ShellUIService的返回逻辑是在主应用的上下文执行的,无法直接触发Tile应用的服务调用逻辑。

可行解决方法

方法1:监听浏览器Hash变化

利用Launchpad返回时浏览器Hash的变化,在Tile应用中监听hashchange事件,触发数据更新。

Tile应用控制器代码:

onInit: function() {
    ...
    // 监听浏览器hash变化
    window.addEventListener("hashchange", this._updateTileData.bind(this));
},

_updateTileData: function() {
    // 根据实际Launchpad的Hash调整判断条件
    if (window.location.hash.startsWith("#Shell-home")) {
        // 调用后端服务更新Tile数字
        this._fetchServiceData();
    }
},

_fetchServiceData: async function() {
    // 示例:调用OData服务获取最新计数
    const oModel = this.getOwnerComponent().getModel();
    const oCountData = await oModel.read("/SolpedCount", {
        success: function(oData) {
            return oData;
        },
        error: function(oError) {
            console.error("获取数据失败", oError);
        }
    });
    // 更新Tile上的数字显示
    this.getView().byId("tileNumberControl").setText(oCountData.Count.toString());
}

方法2:使用Launchpad全局消息通道

通过SAP Fiori Launchpad的Message Channel,主应用返回前发送更新消息,Tile应用监听消息触发更新。

主应用返回逻辑(添加消息发送):

onNavBack: async function() {
    // 获取Launchpad消息服务
    const oMessageService = await sap.ushell.Container.getService("MessageChannel");
    // 发送更新指定Tile的消息
    oMessageService.publish("tileUpdate", { tileId: "SOLPED" });
    // 执行默认返回Launchpad逻辑
    sap.ushell.Container.getService("CrossApplicationNavigation").toExternal({
        target: { shellHash: "#Shell-home" }
    });
}

Tile应用监听消息:

onInit: async function() {
    ...
    const oMessageService = await sap.ushell.Container.getService("MessageChannel");
    // 订阅Tile更新消息
    oMessageService.subscribe("tileUpdate", this._handleTileUpdate.bind(this), this);
},

_handleTileUpdate: function(oEvent) {
    // 仅处理当前Tile的更新请求
    if (oEvent.data.tileId === "SOLPED") {
        this._fetchServiceData();
    }
}

方法3:利用Tile应用的onAfterRendering事件

Launchpad返回时会重新渲染Tile组件,可在onAfterRendering中调用更新逻辑:

Tile应用控制器代码:

onAfterRendering: function() {
    // 调用服务更新数字,可添加缓存逻辑避免重复请求
    this._fetchServiceData();
}

注意:该方法会在Tile每次渲染时触发,建议添加缓存机制(比如记录上次请求时间),避免频繁调用后端服务影响性能。


内容的提问来源于stack exchange,提问作者Gabriel Yepes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:03:12