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

Sapui5 Fiori——跨应用程序导航;处理启动参数?,sapui5,sap-fiori,Sapui5,Sap Fiori,这个问题涉及: 我的用例如下所示: sap.ushell.Container.getService("CrossApplicationNavigation").hrefForExternal({ target : { semanticObject : "ApplicationB", action : "display" }, params : { "someID" : "102343333"} }) https://server/sap/bc/ui5_ui5/ui2/ushe

这个问题涉及:

我的用例如下所示:

sap.ushell.Container.getService("CrossApplicationNavigation").hrefForExternal({
  target : { semanticObject : "ApplicationB", action : "display" },
  params : { "someID" : "102343333"}
})
https://server/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html?sap-client=100&sap-language=EN#SemObject-display?/SomeView(102343333)/
我有多个应用程序可以链接到其他应用程序(deep)。 由于交叉导航文档提到避免深度链接,我决定使用启动参数

例如:

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

应用程序A现在将使用如下导航:

sap.ushell.Container.getService("CrossApplicationNavigation").hrefForExternal({
  target : { semanticObject : "ApplicationB", action : "display" },
  params : { "someID" : "102343333"}
})
https://server/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html?sap-client=100&sap-language=EN#SemObject-display?/SomeView(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)/
无论如何,我更喜欢这样的东西:

sap.ushell.Container.getService("CrossApplicationNavigation").hrefForExternal({
  target : { semanticObject : "ApplicationB", action : "display" },
  params : { "someID" : "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是否适合处理启动参数?

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

你的第二个问题我不太清楚


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

必须按以下方式检索参数:

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(“压缩url”),以解决某些平台和书签中的url长度限制 getComponentData().startupParameters(一个将接收完整的参数集)

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

SemObject display?someID=102343333&/SomeView(102343333)/ 在导航之后可能会是什么样子 SemObject display?someID=102343333&/SomeView(102343999)/

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

has(SemObject display?someID102343333)的“外壳部分”的任何更改都将导致使用不同的启动参数进行跨应用程序导航(重新启动组件)

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

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

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

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

SAP Fiori开发者启动平台,导航概念

我在从Fiori elements应用程序导航到freestyle UI5应用程序的深层页面时遇到问题,然后从@user6649841进行应答,这为我的需求提供了最有效的解决方案

在我的例子中,从中的元素列表报告(应用程序“A”)导航到目标自由式应用程序(应用程序“B”),我根本不希望应用程序B中的工作列表/初始页面显示出来,而是直接转到细节页面,而不会闪烁初始应用程序屏幕

请注意,下面的内容对我很有用,但它并不能解决难看的URL问题。在我的情况下,我不担心这一点,因为我的导航返回将导航返回到元素列表报告(应用程序A),并且不会在应用程序B中显示工作列表页面,因此用户不会在该URL上进行另一次搜索,这将导致内外键不一致

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


在路由器的initialize方法中查看UI5 1.48及以上版本中的UI5 SDK,您可以传入一个布尔值,告诉它忽略初始散列,以便在UI5的较新版本中可能执行更简单的实现假定两个独立的应用程序可以搜索。例如,文章应用程序和生产者应用程序。现在,一篇文章有一个制作人,应该可以从文章应用程序跳转到制作人应用程序中的制作人详细信息视图——因此不必看到制作人的搜索屏幕。这是可行的。。您可以传递上下文参数,如果您查看我的代码,我就是这么做的。但是启动参数看起来像这个BASE?param1=value¶m2=value我的正常导航会做类似于/DetailPage(ID)的事情如果我结合这个,我会有BASE?param1=value¶m2=value&/DetailPage(ID)这不太好。sap.ui.core.getHashChanger().getHash()似乎不存在。可能您的意思是var oHashChanger=new sap.ui.core.routing.HashChanger();var sHash=oHashChanger.getHash()?无论如何,散列还将包括语义对象名,因此在任何情况下它都不会为空。是否有一种很好的方法来检查应用程序的路由部分是否为空?我在UI5 1.44中遇到了同样的问题,但是sap.ui.core.routing.HashChanger.getInstance()是空的