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

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);

问题根因

  1. 手动添加控件未通过绑定管理:直接调用addItem添加克隆的表项,没有纳入模型绑定的管理范围。当旧条目触发onChange导致模型绑定刷新时,框架会重新渲染表格,手动添加的行项会被清理。
  2. 对象引用残留:用已有行的上下文对象初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:05:25