如何在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
相关产品推荐
相关产品推荐

