Odata 如何在onInit上获取模型?

Odata 如何在onInit上获取模型?,odata,sapui5,Odata,Sapui5,在manifest.json中,我有以下模型定义: { “sap.ui5”:{ “模型”:{ “销售发票”:{ “类型”:“sap.ui.model.odata.v2.ODataModel”, “设置”:{ “defaultOperationMode”:“服务器”, “defaultCountMode”:“请求” }, “数据源”:“ZAM_销售统计数据\u CD”, “预加载”:真 } } } } 如您所见,saleinvoices已连接到OData服务 现在,在控制器中的onInit函数中

manifest.json
中,我有以下模型定义:

{
“sap.ui5”:{
“模型”:{
“销售发票”:{
“类型”:“sap.ui.model.odata.v2.ODataModel”,
“设置”:{
“defaultOperationMode”:“服务器”,
“defaultCountMode”:“请求”
},
“数据源”:“ZAM_销售统计数据\u CD”,
“预加载”:真
}
}
}
}
如您所见,
saleinvoices
已连接到
OData
服务

现在,在控制器中的
onInit
函数中,我试图从
OData
获取
元数据,如下所示:

{//Controller
onInit:function(){
const oPayerModel=this.getView().getModel(“销售发票”);
log(oPayerModel.getMetadata());
设置超时(()=>{
const oPayerModel=this.getView().getModel(“销售发票”);
log(oPayerModel.getMetadata());
}, 600);
},
// ...
}
如您所见,我必须延迟才能获取OData实例。

setTimeout
不建议在SAPUI5中使用,如何才能做得更好?

您可以通过使用返回承诺的API来避免
setTimeout
。一旦成功加载服务元数据,承诺就实现了

onInit:async函数(){
const oPayerModel=this.getOwnerComponent().getModel(“销售发票”);
等待oPayerModel.metadataLoaded();
const serviceMetadata=oPayerModel.getServiceMetadata();//NOT.getMetadata()
// ...
},

关于在
onInit
中未定义的模型,以下是答案和更好的解释:


我想您遇到了我不久前报告的问题:

  • 不要直接在
    onInit()中使用此.getView().getModel()
  • onInit()中使用此.getOwnerComponent().getModel()
  • 在控制器中的任何其他位置都可以使用
    this.getView().getModel()
在您的情况下,您可以稍微更改@boghyon的建议:

onInit: function() {
  const oPayerModel = this.getOwnerComponent().getModel("SalesInvoices");
  oPayerModel.metadataLoaded().then(this.onMetadataLoaded.bind(this, oPayerModel));
},

onMetadataLoaded: function(myODataModel) {
  const metadata = myODataModel.getServiceMetadata(); // NOT .getMetadata()
  // ...
},

通过这种方式,您可以摆脱
setTimeout(…)

对象
oPayerModel
const oPayerModel=This.getView().getModel(“销售发票”)上未定义,这就是为什么我使用
setTimeout()
,因为延迟。为什么
oPayerModel
未定义?@zero\u编码,这就是实际问题所在。如果你能在问题中提到这一点,那就太好了。不管怎样,是我的错,因为我忽略了这一点。作为或,将
.getView().getModel
替换为
.getOwnerComponent().getModel
。原因是视图在
onInit
中还不知道其父视图。因此,组件(在清单中定义)中的模型尚未传播到视图。