SAP UI5 sap.m.Table新增行项修改旧条目后消失问题
sap.m.Table新增行编辑旧条目时消失的解决方案
问题场景
需实现两类编辑功能:
- 修改已有条目
- 添加新条目并更新旧条目
第二种场景中,新条目能成功添加到表格,但修改旧条目时,新增行会直接消失。
当前代码实现
新条目对象初始化
NewLineItem = oLineItmTab.getItems()[0].getBindingContext().getObject(); // 之后清空该对象所有属性值
手动添加新行代码
let oContextLineItemEntry = oLineItmTab.getModel().createEntry("/EntityName", { properties: NewLineItem, }); let oTmp = oLineItmTab.getBindingInfo("items").template, oItem = oTmp.clone(); oItem.setBindingContext(oContextLineItemEntry); oLineItmTab.addItem(oItem);
问题根因
- 手动添加控件未通过绑定管理:直接调用
addItem添加克隆的表项,没有纳入模型绑定的管理范围。当旧条目触发onChange导致模型绑定刷新时,框架会重新渲染表格,手动添加的行项会被清理。 - 对象引用残留:用已有行的上下文对象初始化
NewLineItem,即使清空属性,该对象仍持有原实体的引用,后续模型更新时可能引发数据关联混乱。
修复方案
1. 通过模型绑定管理所有条目(推荐)
放弃手动添加表项的方式,让表格通过绑定自动渲染所有条目(包括新增的草稿条目):
// 获取表格的items绑定 const oItemsBinding = oLineItmTab.getBinding("items"); // 创建全新的空条目对象(避免引用已有实体) const oNewLineItem = {}; // 可选:基于实体元数据生成匹配的空结构 // const oEntityMeta = oLineItmTab.getModel().getMetaModel().getEntityType("/EntityName"); // Object.keys(oEntityMeta.properties).forEach(field => oNewLineItem[field] = ""); // 创建OData草稿条目 oLineItmTab.getModel().createEntry("/EntityName", { properties: oNewLineItem, success: () => { // 刷新绑定,表格自动渲染新条目 oItemsBinding.refresh(); } });
2. 修正新条目初始化方式
禁止直接引用已有行的对象,必须创建全新对象:
// 错误方式:引用已有对象 // NewLineItem = oLineItmTab.getItems()[0].getBindingContext().getObject(); // 正确方式:创建全新空对象 const NewLineItem = {}; // 或根据实体元数据生成空结构
3. 确保绑定逻辑正确
无需强制设置OneWay绑定,保持OData V2模型默认的TwoWay绑定即可,核心是让表格通过绑定上下文集合管理所有行项,而非手动操作控件。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

