如何在UI5 1.120.9中通过CrossAppNavigation传递数组?
适配UI5 1.120.9的FLP跨应用传递数组(AppState方案)
问题核心原因
你尝试用AppState传递数组失败,主要是没正确处理createEmptyAppStateAsync和save的异步特性,同时存在模板字符串语法错误、变量引用不一致的问题。
发送端正确实现代码
以下是适配UI5 1.120.9的完整发送端代码,修复异步逻辑及语法问题:
sap.ushell.Container.getServiceAsync("CrossApplicationNavigation").then((oCrossAppNav) => { // 1. 异步创建空AppState实例 oCrossAppNav.createEmptyAppStateAsync(this) .then((oAppState) => { // 2. 设置需要传递的数组数据 const arrayData = ["PLANT01", "MAT001", "LOC003"]; // 替换为你的实际数组 oAppState.setData(arrayData); // 3. 异步保存AppState(必须等待保存完成才能获取有效key) return oAppState.save(); }) .then((oSavedAppState) => { // 4. 生成带AppState标识的导航Hash(用反引号实现变量解析) const targetHash = `xyz&sap-iapp-state=${oSavedAppState.getKey()}`; return oCrossAppNav.getHrefForAppSpecificHash(targetHash); }) .then((hash) => { const navigationOption = "newTab"; // 你的导航选项 if (navigationOption === "newTab") { sap.m.URLHelper.redirect(hash, true); } else { oCrossAppNav.navigate({ target: { shellHash: hash } }); } }) .catch((err) => { console.error("AppState处理失败:", err); }); });
发送端关键修正点
createEmptyAppStateAsync和save都是异步方法,必须通过then链式调用等待执行完成,不能同步直接使用返回值- 模板字符串必须用反引号(
)包裹,才能正确解析${变量}`格式的内容 - 统一使用
oCrossAppNav变量,避免原代码中oCrossAppNav与oCrossAppNavigator的引用不一致问题 - 增加错误捕获逻辑,便于快速排查问题
接收端实现代码(必配)
目标应用必须配置接收逻辑,才能获取传递的数组数据:
// 在目标应用的控制器onInit或合适的生命周期方法中添加 sap.ushell.Container.getServiceAsync("CrossApplicationNavigation").then((oCrossAppNav) => { // 从组件数据中获取启动参数里的AppState key const oComponentData = this.getOwnerComponent().getComponentData(); const appStateKey = oComponentData?.startupParameters?.["sap-iapp-state"]?.[0]; if (appStateKey) { // 通过key获取AppState中存储的数组数据 oCrossAppNav.getAppState(appStateKey) .then((oAppState) => { const receivedArray = oAppState.getData(); console.log("接收的数组数据:", receivedArray); // 此处添加你的数组业务逻辑处理 }) .catch((err) => { console.error("获取AppState失败:", err); }); } });
接收端注意事项
- FLP部署的应用启动参数会自动传入
componentData.startupParameters,确保目标应用的Component能正常获取该数据 - AppState的key由FLP管理,默认有有效期,适合临时跨应用传递数据
额外验证项
- 确认两个应用部署在同一FLP实例下,且已完成FLP目录注册
- UI5 1.120.9版本完全支持
CrossApplicationNavigation服务的createEmptyAppStateAsync、save、getAppState方法,无需兼容旧API - 测试时打开浏览器控制台,查看是否有报错信息,快速定位问题
内容的提问来源于stack exchange,提问作者Newbiecodie
相关产品推荐
相关产品推荐

