Fiori——跨应用导航;处理启动参数?

Fiori -- Cross application navigation; Handling startup parameters?

这个问题是关于:

我的用例是这样的:

我有多个应用程序应该 link 给其他人(深)。 由于交叉导航文档提到避免深度 links 我决定使用启动参数。

例如:

应用程序 A 在一个项目的详细视图中有一些项目的列表 有对包含其他一些详细信息的另一个应用程序 B 的引用。 假设A展示文章详情,B展示文章制作人的一些详情。

应用程序 A 现在将使用这样的导航:

sap.ushell.Container.getService("CrossApplicationNavigation").hrefForExternal({
  target : { semanticObject : "ApplicationB", action : "display" },
  params : { "someID" : "102343333"}
})

现在在应用程序 B 中,我在 init 方法末尾的 Component.js 中使用这样的代码。

var oRouter = that.getRouter().initialize();
var oComponentData = this.getComponentData();
if (oComponentData.startupParameters) {
    oRouter.navTo("SomeView", {
        someId : oComponentData.startupParameters.someID[0],
    }, false);
}

第一个问题:这是处理启动参数的正确位置吗?

第二个问题:如果我使用导航,启动参数仍然在代码中,我希望将其删除,但是如何?

更新

在目标应用程序 (B) 中,它将导致以下 URL:

https://server/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html?sap-client=100&sap-language=EN#SemObject-display?someID=102343333&/SomeView(102343333)/

无论如何我更喜欢这样的东西:

https://server/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html?sap-client=100&sap-language=EN#SemObject-display?/SomeView(102343333)/

Component.js 是处理启动参数的正确位置吗?

视情况而定,如果您有多个视图并且希望根据传入参数进行动态路由。否则你也可以在特定视图中处理。

你的第二个问题我不是很清楚

不过,如果您只想启动参数的特定情况,则从 Source App 设置一些标志以了解请求来自何处并进行相应处理。这样一来,您的正常导航就不会被篡改。

参数必须检索为

var oComponentData = this.getComponentData();
if (oComponentData.startupParameters) {
    oRouter.navTo("SomeView", {
        someId : oComponentData.startupParameters.someID[0],
    }, false);

如您所写。在 Fiori 应用程序中,注入到构造函数的组件数据中的启动参数可能已被重命名,通过更多默认值等进行丰富。因此它们可能与 url 中观察到的参数不同。建议应用程序不要尝试直接检查 URL。

如果提供一组非常长的 url 参数,将会观察到 FLP 将其中一些替换为 sap-intent-param=AS123424 ("compacted URL") 以解决 url 某些平台和书签中的长度限制,在 getComponentData().startupParameters 将收到全套参数)。

关于第二个问题。 不,目前没有办法 "cleanse" 和 URL 并避免内部应用程序路由之间的冗余。

SemObject-display?someID=102343333&/SomeView(102343333)/ 导航后可能看起来像 SemObject-display?someID=102343333&/SomeView(102343999)/

应用程序以 102343333 启动,但随后用户在应用程序内导航到另一个项目 (102343999)。

has (SemObject-display?someID102343333) 的 "Shell-part" 中的任何更改都将导致使用不同的启动参数进行跨应用导航(重新实例化您的组件)。

(在某些情况下,流程中需要这样做,例如通过 link 从 OrgUnit 资料表到父 OrgUnit 资料表的交叉导航)。

SAP 内部有融合应用程序内部路由和意图参数的想法,但没有付诸实施,因为这主要是 url 美学。

注意:要支持标记,必须同时考虑启动参数和 组件实例化期间的内部应用程序路由, 假设用户在

上创建了书签

SemObject-display?someID=102343333&/SomeView(102343999)/ (当他在看 9999(!) 时)。

重新实例化应用程序时,应用程序内部路由的优先级应高于启动参数。

所以修改代码为:

var oComponentData = this.getComponentData();
if (oComponentData.startupParameters) {
    if (sap.ui.core.getHashChanger().getHash()=== "") {
         // if no inner app route present, navigate 
         oRouter.navTo("SomeView", {
               someId : oComponentData.startupParameters.someID[0],
         }, false);
    }

}

https://sapui5.netweaver.ondemand.com/#docs/api/symbols/sap.ushell.services.CrossApplicationNavigation.html

面向开发人员的 SAP Fiori Launchpad,导航概念 http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/907ae317-cb47-3210-9bba-e1b5e70e5c79?QuickLink=index&overridelayout=true&59575491523067

我在从 Fiori 元素应用程序导航到自由式 UI5 应用程序的深层页面时遇到问题,然后@user6649841 的回答提供了满足我要求的大部分解决方案。

在我的实例中,从元素列表报告 (app "A") 导航到目标 freestyle 应用程序 (app "B") 我不想要 worklist/initial 页面应用程序 B 完全显示,而不是直接进入详细信息页面,初始应用程序屏幕不会闪烁。

以下对我有用,请注意,尽管它没有解决难看的 URL 问题。就我而言,我对此并不担心,因为我的导航返回将导航回元素列表报告(应用程序 A)并且从不在应用程序 B 中显示工作列表页面,因此用户永远不会在此之上进行其他搜索 URL 这会导致内外键不一致

Component.js(在所有标准 sap 代码之后的 init 函数末尾,但在路由器初始化之前):

var oComponentData = this.getComponentData();
var startupParams = oComponentData.startupParameters;

 if (startupParams && startupParams.myQueryStringParamName && startupParams.myQueryStringParamName[0]) {
    //In my case using hash changer as I dont want the original landing page (default route) to be
    //in the history, so the detail page loads straight away and nav back will cause to nav back to App A
    var hashChanger = sap.ui.core.routing.HashChanger.getInstance();
    hashChanger.replaceHash("detailPage/" + startupParams.myQueryStringParamName[0]);
}
//initialise after the above so the new hash is set and it doesnt initially load the
//page assigned to the default route causing a flickering and nav slide effect
this.getRouter().initialize();

查看 UI5 1.48 及更高版本中的 UI5 SDK 在路由器的初始化方法中,您可以传入一个布尔值以告诉它忽略初始哈希,因此可能可以在较新版本的 UI5 中执行更简单的实现