Fiori - 跨应用程序导航;处理启动参数?

时间:2016-02-01 10:49:12

标签: sapui5 sap-fiori

这个问题与:

有关

我的用例是这样的:

我有多个应用程序应该链接到其他应用程序(深层)。 由于交叉导航文档提到避免深层链接,我决定使用启动参数。

例如:

应用程序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)/

3 个答案:

答案 0 :(得分:3)

必须将参数检索为

var oComponentData = this.getComponentData();
if (oComponentData.startupParameters) {
    oRouter.navTo("SomeView", {
        someId : oComponentData.startupParameters.someID[0],
    }, false);
你写的时候。在Fiori应用程序中,注入构造函数的Component数据的启动参数可能已经重命名,并通过其他默认值等进行了丰富。因此,它们可能与url中观察到的参数不同。建议应用程序避免尝试直接检查URL。

如果提供了一组很长的url参数,人们会观察到FLP用sap-intent-param = AS123424("压缩的URL")替换其中的一些参数来解决网址长度限制问题。一些平台和书签,在 getComponentData()。startupParameters one将收到完整的参数集)。

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

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

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

" Shell-part" has(SemObject-display?someID102343333)将导致使用不同的startupParameter进行跨应用程序导航(重新部署组件)。

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

SAP内部有一些想法可以融合内部应用程序路径和意图参数,但它们并没有被执行,因为它主要是网址美学。

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

上创建了书签

SemObject显示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 for Developers,导航概念 http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/907ae317-cb47-3210-9bba-e1b5e70e5c79?QuickLink=index&overridelayout=true&59575491523067

答案 1 :(得分:1)

我在从Fiori elements应用程序导航到自由式UI5应用程序中的深层页面时遇到问题,然后从@ user6649841处获得答案,为我的需求提供了大多数解决方案。

在我的实例中,从元素列表报告(应用程序“ A”)导航到目标自由式应用程序(应用程序“ B”),我根本不想显示应用程序B中的工作列表/初始页面,而是直接进入详细信息页面,而不会闪烁初始应用程序屏幕。

以下内容对我有用,请注意,尽管它不能解决难看的URL问题。就我而言,我对此并不感到困惑,因为我的导航将导航回元素列表报告(App A),并且从不显示App 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();

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

答案 2 :(得分:0)

Component.js是否适合处理启动参数?

取决于,如果您有多个视图,并且您希望根据传入参数动态路由。另外,您也可以在特定视图中处理。

你的第二个问题对我来说并不十分清楚。

尽管如此,如果您只想要启动参数的特定情况,那么从源应用程序中,设置一些标志以了解请求来自何处并进行相应处理。这样,您的正常导航就不会被篡改。