如何在onInit上获得模型?

时间:2018-01-22 10:58:54

标签: sapui5

在清单文件中,我有以下模型定义:

"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,我该怎样才能做得更好?

2 个答案:

答案 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

  • 请勿在{{1​​}}
  • 中直接使用 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() // ... },