SAP UI5中sap.ui.table动态绑定下模型自动更新异常问题
问题分析与解决方案
核心问题:错误访问OData模型内部属性导致误以为数据未更新
你遇到的模型值未更新的假象,主要是因为直接访问了OData V2模型的私有内部属性oData,而非使用官方提供的API获取数据。同时需确认双向绑定的生效条件。
错误原因详解
oModel.oData是私有属性:OData V2模型的oData属于内部实现细节,并非公开API。在Client操作模式下,双向绑定的更新不会实时同步到这个对象中,直接读取它会得到旧数据。- 字段可写性验证:需确保OData服务元数据中
BacklogHeaderSet实体的Vkorg字段标记为可更新(sap:updatable="true"),否则双向绑定无法生效。
修正方案
1. 使用官方API获取模型数据
修改onLoopSO函数,通过表格绑定上下文或模型getObject()方法获取最新数据:
onLoopSO: function () { var oModel = this.getView().getModel("myModel4"); var oTable = this.getView().byId("table40"); var oRowsBinding = oTable.getBinding("rows"); if (!oRowsBinding) return; // 获取表格所有绑定上下文 var aRowContexts = oRowsBinding.getContexts(); aRowContexts.forEach(function(oContext) { // 通过上下文路径获取实体数据 var oRecord = oModel.getObject(oContext.getPath()); console.log(oRecord.Vbeln, oRecord.Posnr, oRecord.Vkorg); }); }
2. 实时验证双向绑定效果
在onChange事件中直接读取当前输入框绑定的上下文数据,确认模型是否已更新:
onChange: function(oEvent) { var oInput = oEvent.getSource(); var oContext = oInput.getBindingContext("myModel4"); if (oContext) { // 直接从绑定上下文获取最新值 var sUpdatedVkorg = oContext.getProperty("Vkorg"); console.log("模型中最新的Vkorg值:", sUpdatedVkorg); } }
3. 优化模型创建配置(可选)
创建OData模型时,可直接在配置中指定双向绑定模式,避免后续单独调用:
onBind: function() { var oModel = new sap.ui.model.odata.v2.ODataModel("/sap/opu/odata/sap/ZBAJUSZ_ODATA_BACKLOG_SRV/", { defaultOperationMode: sap.ui.model.odata.OperationMode.Client, defaultBindingMode: sap.ui.model.BindingMode.TwoWay // 直接配置 }); var myTable = this.getView().byId("table40"); myTable.setBusy(true); oModel.read("/BacklogHeaderSet", { success: function() { myTable.setBusy(false); }.bind(this), error: function() { myTable.setBusy(false); } }); this.getView().setModel(oModel, "myModel4"); }
内容的提问来源于stack exchange,提问作者Péter Bajusz
相关产品推荐
相关产品推荐

