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
中还不知道其父视图。因此,组件(在清单中定义)中的模型尚未传播到视图。