获取SAPUI5 v2 ODataModel的服务元数据?

时间:2015-08-11 10:01:53

标签: odata sapui5

我尝试获取sapui5 v2 odata模型的服务元数据。 代码:

var oModel = new sap.ui.model.odata.v2.ODataModel(someServiceURL);
var oMetadata = oModel.getServiceMetadata();

这应该按照这个页面工作: https://openui5beta.hana.ondemand.com/docs/guide/6c47b2b39db9404582994070ec3d57a2.html

无论如何我得到了" undefined"为oMetadata。 如果我将代码更改为:

var oModel = new sap.ui.model.odata.v2.ODataModel({
        loadMetadataAsync : false,
        serviceUrl : someServiceURL
});

仍为oMetadata === undefined

根据SDK文档,元数据应同步加载:

  

返回元数据对象。使用时请注意   bLoadMetadataAsync = true然后此函数可能返回undefined   因为尚未加载元数据。在这种情况下附加到   metadataLoaded事件,以便在元数据发布时收到通知   可用,然后调用此函数。

我的代码出了什么问题?

我正在使用(1.28.11):

<script src="https://sapui5.netweaver.ondemand.com/resources/sap-ui-core.js"    ...

我开始调试UI5代码并检测到以下行: this.bLoadMetadataAsync = true;

我开始调试SAPUI5代码并检测到以下行(似乎每次调用):

this.bLoadMetadataAsync = true;

这是一个错误吗?或者我的代码有问题吗?

2 个答案:

答案 0 :(得分:2)

<强>解决方案: 以下是在实际应用环境中为我工作的。我想它没有被我的小提琴解雇是因为没有提出实际的数据要求:

var oModel = new sap.ui.model.odata.v2.ODataModel(<ServiceURL>);

oModel.attachMetadataLoaded(null, function(){
   var oMetadata = oModel.getServiceMetadata();
   console.log(oMetadata);
},null);

引导解决方案:

好的,所以我开始玩这个,发现以下内容:

  • .getServiceMetadata()sap.ui.model.odata.ODataModel合作正常。
  • sap.ui.model.odata.v2.ODataModel对元数据的请求是通过网络发送的,但某种方式.getServiceMetadata()已返回undefined
  • 我试过sap.ui.model.odata.v2.ODataModel.attachMetadataLoaded(),但事件从未被解雇过。 (这仅适用于我使用的jsbin)

我将根据我的任何进一步调查结果对此进行编辑。如果您有任何应该包含在我的发现/测试中的信息,请告诉我。

修改

bLoadMetadataAsync是您可以在sap.ui.model.odata.ODataModel上设置的参数。该参数不再位于sap.ui.model.odata.v2.ODataModel的API中。我假设异步加载已被选为默认值。

修改 @ user3783327在此处报告了一个错误:https://github.com/SAP/openui5/issues/564

答案 1 :(得分:0)

作为sirion already mentioned,ODataModel现在有一个名为metadataLoaded的API,它会相应地返回一个promise。在resolve函数中,我们绝对可以获得服务元数据via getServiceMetadata()

myODataModel.metadataLoaded()
  .then(() => /*Do something with*/ myODataModel.getServiceMetadata());

或者,我们也可以使用可以在任何ManagedObject(包括View)上设置的ODataMetaModel,并提供与服务元数据相关的几个有用的访问器。为了获得元模型,我们需要使用ODataModel中的相应API,而不是直接实例化模型:

myODataModel.getMetaModel().loaded()
  .then(() => /*Do something with*/ myODataModel.getMetaModel()/*...*/ );