在运行时如何在默认模型中设置/更改" serviceUrlParams"?

2020-08-24 00:00发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


尊敬的专家,

我想设置或更改默认模型中的" serviceUrlParams",该默认模型是根据" manifest.json"中的信息自动生成的。

以下链接引用了显示解决方案的旧帖子,但该解决方案在我的情况下不起作用: https://archive.sap.com/discussions/thread/3903730

我在" Component.js"中的函数" init"中添加了以下代码(如文章中所述),但这没有任何效果,因为默认模型"已经存在":

 var oManifestUi5 = this.getMetadata()。getManifestEntry(" sap.ui5");
 oManifestUi5.models [""]。settings.serviceUrlParams [" sap-client"] = _sapClient;
 

默认模型必须在函数" init"之前创建,因此它已经存在,我可以调用

 this.getModel(); 

要获取对模型的引用并进行更改,问题是" serviceUrlParams"是私有成员,无法在运行时进行更改。

有人可以解决吗?

最诚挚的问候,奥利弗

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


尊敬的专家,

我想设置或更改默认模型中的" serviceUrlParams",该默认模型是根据" manifest.json"中的信息自动生成的。

以下链接引用了显示解决方案的旧帖子,但该解决方案在我的情况下不起作用: https://archive.sap.com/discussions/thread/3903730

我在" Component.js"中的函数" init"中添加了以下代码(如文章中所述),但这没有任何效果,因为默认模型"已经存在":

 var oManifestUi5 = this.getMetadata()。getManifestEntry(" sap.ui5");
 oManifestUi5.models [""]。settings.serviceUrlParams [" sap-client"] = _sapClient;
 

默认模型必须在函数" init"之前创建,因此它已经存在,我可以调用

 this.getModel(); 

要获取对模型的引用并进行更改,问题是" serviceUrlParams"是私有成员,无法在运行时进行更改。

有人可以解决吗?

最诚挚的问候,奥利弗

付费偷看设置
发送
3条回答
吹牛啤
1楼 · 2020-08-24 00:19.采纳回答

嗨,奥利弗,

我找到了解决方法。

在Component.js中,您应该覆盖函数" initComponentModels"。

在我的情况下,我需要一个Metadata Hash参数来知道是否需要从缓存或服务器中检索元数据。

这是我的代码。

/**
          *照原样复制,但随后添加了" manifest.json"部分
          *
          * @override
          */
         initComponentModels:function(){
            //如果没有父元数据,我们只需跳过该函数
            //因为这意味着要在Component基类上初始化模型
             var oMetadata = this.getMetadata();
             如果(oMetadata.isBaseClass()){
                 返回;
             }
    
            //检索清单的合并的sap.app和sap.ui5部分
            //为组件+继承的模型创建模型
             var oManifestDataSources = this._getManifestEntry("/img/sap.app/dataSources",true)||  {};
             var oManifestModels = this._getManifestEntry("/img/sap.ui5/models",true)||  {};
            
/*********** StartOf manifest.json **********************************  ******************/
             var mtHash = jQuery.sap.getUriParameters()。get("元数据哈希");
             如果(mtHash){
                 oManifestModels [""]。settings.metadataUrlParams.hash = mtHash;
             }
/********** EndOf manifest.json ***************************************  *******************/
            
            //将模型和数据源传递给内部帮助器
             this._initComponentModels(oManifestModels,oManifestDataSources);
         } 

但是,如果您只需要更改参数" sap-client",则这不是正确的方法。 (在我以前的文章中,我没有经验,也不知道事情如何运作)。 您可以将参数" sap-client"更改为网址参数。

因此,如果您的网站 http://my.website.com 写下" http://my.website.com ?sap-client = 100"

我希望这会有所帮助。

最好的问候

艾德里安

风早神人
2楼-- · 2020-08-24 00:19

太好了! 谢谢。

槿木_熙
3楼-- · 2020-08-24 00:20

嗨,艾德里安,

您的解决方案有效,但是我不知道这是否是重写函数" initComponentModels"的最佳方法,因为当函数在较新的SAPUI5-Version中更改时,这可能是个问题。

我找到了另一个对我有用的解决方案:您可以在运行时在组件的"初始化"功能中的模型上设置自定义标头:

 init:function(){
//调用基本组件的init函数 UIComponent.prototype.init.apply(this,arguments);
//... var oComponentData = this.getComponentData(); 如果(oComponentData){ var test = oComponentData.startupParameters [" test"]; this.getModel()。setHeaders({" X-TEST":test}); }
}

在ABAP网关系统中,我可以读取以下自定义标头:

数据:lt_header TYPE tihttpnvp,
       ls_header与lt_header类似,
       l_test TYPE字符串,
       lo_request类型参考/iwbep/cl_mgw_request,
       lo_req_details TYPE/iwbep/if_mgw_core_srv_runtime => ty_s_mgw_request_context。

 刷新lt_header。
 lo_request?= i_o_tech_request_context。
 lo_req_details = lo_request-> get_request_details()。
 将lo_req_details-technical_request-request_header的附加行添加到lt_header。

 *从HTTP标头读取参数(小写!)
 读取表lt_header并使用键名='x-test'进入ls_header。
 如果sy-subrc = 0。
   l_test = ls_header-value。
   压缩l_test。
 ENDIF。

如果有人有更好的解决方案,请告诉我。

橄榄

一周热门 更多>