我尝试获取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;
这是一个错误吗?或者我的代码有问题吗?
答案 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()/*...*/ );