这个问题与:
- Fiori - 跨应用程序导航
- http://help.sap.com/saphelp_uiaddon10/helpdata/en/07/9561b716bb4f2f8ae4e47bacbdb86d/content.htm
- 删除路由上的 URL 参数
我的用例是这样的:
我有多个应用程序应该链接到其他应用程序(深度(。由于交叉导航的文档提到避免深层链接,我决定使用启动参数。
例如:
应用程序 A 在一个项目的详细信息视图中具有一些项目的列表,其中有一个对另一个应用程序 B 的引用,其中包含一些其他详细信息。假设 A 显示文章详细信息,B 显示文章生产者的一些详细信息。
应用程序 A 现在将使用如下所示的导航:
sap.ushell.Container.getService("CrossApplicationNavigation").hrefForExternal({
target : { semanticObject : "ApplicationB", action : "display" },
params : { "someID" : "102343333"}
})
现在在应用程序 B 中,我在组件中使用这样的代码.js在 init 方法的末尾。
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)/
参数必须检索为
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( 的"Shell 部分"的任何更改都将导致具有不同 startupParameter 的跨应用导航(组件的重新实例化(。
(在某些情况程中需要这样做,例如,通过链接从组织单位情况说明书到父组织单位情况说明书的交叉导航(。
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);
}
}
https://sapui5.netweaver.ondemand.com/#docs/api/symbols/sap.ushell.services.CrossApplicationNavigation.html
面向开发人员的 SAP Fiori 启动板,导航概念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回答,为我的需求提供了大部分解决方案。
在我的实例中,从元素列表报告(应用程序"A"(导航到目标自由式应用程序(应用程序"B"(,我根本不希望应用程序 B 中的工作列表/初始页面显示,而是直接转到详细信息页面,而不会闪烁初始应用程序屏幕。
下面的对我有用,请注意,尽管它不能解决丑陋的 URL 问题。就我而言,我对此并不大惊小怪,因为我的导航返回将导航回元素列表报告(应用程序 A(,并且永远不会在应用程序 B 中显示工作列表页面,因此用户永远不会在此 URL 顶部进行另一次搜索,这将导致不一致的内部和外部键
组件.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中执行更简单的实现
.js是处理启动参数的正确位置吗?
取决于,如果您有多个视图,并且希望根据传入的参数动态路由。否则,您也可以在特定视图中处理。
你的第二个问题我不太清楚。
但是,如果您只想了解启动参数的特定情况,则可以从Source App中设置一些标志以了解请求来自何处并相应地进行处理。因此,这样,您的正常导航就不会被篡改。