在清单文件中,我有以下模型定义:
"models": {
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleName": "com.mindustry.SalesStatistics2.i18n.i18n"
}
},
"SalesInvoices": {
"type": "sap.ui.model.odata.v2.ODataModel",
"settings": {
"defaultOperationMode": "Server",
"defaultBindingMode": "OneWay",
"defaultCountMode": "Request"
},
"dataSource": "ZAM_SALES_STATISTICS_CDS",
"preload": true
},
"PayersInfo": {
"type": "sap.ui.model.odata.v2.ODataModel",
"settings": {
"defaultOperationMode": "Server",
"defaultBindingMode": "OneTime",
"defaultCountMode": "Request"
},
"dataSource": "ZAM_PAYER_INFO_CDS",
"preload": true
}
},
正如您所见, SalesInvoices 已连接到OData
服务。
现在,在控制器的onInit
功能中,我正试图从Metadata
获取OData
,如下所示:
onInit: function() {
const oPayerModel = this.getView().getModel("SalesInvoices");
console.log(oPayerModel.getMetadata());
setTimeout(() => {
const oPayerModel = this.getView().getModel("SalesInvoices");
console.log(oPayerModel.getMetadata());
}, 600)
},
如您所见,我必须延迟获取OData实例
建议不要在SAPUI5中使用setTimeout
,我该怎样才能做得更好?
答案 0 :(得分:6)
您可以使用API mentioned in this answer而不是metadataLoaded
来避免setTimeout
,而是返回承诺。成功加载服务元数据后,即可完成承诺。
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()
// ...
},
关于onInit
中未定义的模型,"修复"在...中提到:
答案 1 :(得分:3)
我认为你遇到了我前段时间报道过的问题:Component + default OData model: this.getView().getModel() returns undefined in onInit() of controllers:
this.getView().getModel()
onInit()
this.getOwnerComponent().getModel()
您可以使用onInit()
在控制器中的在你的情况下,你可以稍微改变@boghyon的建议:
this.getView().getModel()
这样你可以摆脱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()
// ...
},
。