You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JSONModel中保存OData响应?解决getProperty未定义报错

问题分析与修复:OData调用中getProperty报错

我需要调用OData服务,按Anno和Mese两个属性过滤Timesheet实体,并展开关联的stato和righe实体,把响应结果保存到JSONModel用于视图绑定。但代码运行时报错:

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'getProperty') at f.loadTimesheet (Home.controller.js:41:39) at f.onInit (Home.controller.js:24:22)

我的代码如下:

onInit: function () {
        // 
        var oModel = new JSONModel()
        this.getView().setModel(oModel, "timesheetModel")
        
        this.loadTimesheet();

    },
  

    loadTimesheet: function (oEvent) {
        var oView = this.getView()
        var oModel = oView.getModel("timesheetModel")

        var service = "http://localhost:4004/v2/odata/v4";//url del mio servizio Odata
        var oTimesheet = oView.getModel("Timesheet")
        // var oTimesheet = new ODataModel("http://localhost:4004/v2/odata/v4")
        // this.getView().setModel(oTimesheet, "Timesheet")
        var anno = oTimesheet.getProperty("/Anno")
        var mese = oTimesheet.getProperty("/Mese")

        var oDataModel = new ODataModel(service)
        this.getView().setModel(oDataModel)

        oTimesheet.read("/Timesheet", {
            filters: [
                new Filter("Anno", FilterOperator.EQ, anno),
                new Filter("Mese", FilterOperator.EQ, mese),
            ],

            urlParameters: {
                "$expand": "stato,righe"
            },
            success: function (oData) {
                var oModel = this.getView().getModel("timesheetModel")
                oModel.setData(oData)

            }.bind(this),
            error: function (err) {
                console.error(err)
            }
        })


    }

报错原因

报错核心是oTimesheet为undefined:

  • 你注释掉了创建并设置Timesheet命名模型的代码,调用oView.getModel("Timesheet")时,视图中不存在这个模型,返回undefined,自然无法调用getProperty方法。
  • 额外逻辑问题:你试图从OData模型中获取Anno和Mese,但这两个过滤参数通常应该来自用户输入(比如视图绑定的输入控件),而非OData模型本身;同时你创建了新的oDataModel却未使用,反而用未定义的oTimesheet发起请求。

修复后的代码

假设Anno和Mese来自视图绑定的用户输入(绑定到timesheetModel),修复代码如下:

onInit: function () {
    var oModel = new JSONModel();
    // 初始化过滤参数默认值(可根据需求调整)
    oModel.setData({
        Anno: 2024,
        Mese: 10
    });
    this.getView().setModel(oModel, "timesheetModel");
    
    this.loadTimesheet();
},

loadTimesheet: function () {
    var oView = this.getView();
    var oTimesheetModel = oView.getModel("timesheetModel");
    // 从绑定输入的JSONModel中获取过滤参数
    var anno = oTimesheetModel.getProperty("/Anno");
    var mese = oTimesheetModel.getProperty("/Mese");

    var serviceUrl = "http://localhost:4004/v2/odata/v4";
    // 创建OData模型并直接发起请求
    var oODataModel = new ODataModel(serviceUrl);

    oODataModel.read("/Timesheet", {
        filters: [
            new Filter("Anno", FilterOperator.EQ, anno),
            new Filter("Mese", FilterOperator.EQ, mese),
        ],
        urlParameters: {
            "$expand": "stato,righe"
        },
        success: function (oData) {
            // 将结果设置到timesheetModel用于视图绑定
            oTimesheetModel.setData(oData);
        }.bind(this),
        error: function (err) {
            console.error("加载Timesheet失败:", err);
        }
    });
}

关键修改点

  • 移除未定义的Timesheet模型相关代码,直接创建OData模型发起请求。
  • 调整过滤参数获取逻辑:从用于绑定用户输入的timesheetModel中获取Anno和Mese,若参数来源不同(如URL参数、其他模型),请对应修改获取方式。
  • 确保已正确引入Filter和FilterOperator(如在控制器顶部添加sap.ui.model.Filter、sap.ui.model.FilterOperator的导入)。

内容的提问来源于stack exchange,提问作者Malinowa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:13:25