SAPUI5表格单元格值状态切换后消失问题求助
解决SAPUI5表格工厂函数创建控件后验证状态丢失问题
这个问题我之前也碰到过,核心原因是表格重渲染时会通过工厂函数重新创建控件实例,你之前手动调用setValueState设置的错误状态只保存在旧的控件实例上,新生成的控件实例没有这个状态,所以切换后红色边框就消失了;而再次修改同一控件时,liveChange事件又给当前的新实例设置了状态,所以能正常显示。
要解决这个问题,关键是把验证状态和模型数据绑定在一起,让状态保存在模型里,而不是只存在于控件实例中。下面是具体的实现步骤:
1. 给模型数据添加错误状态属性
首先需要给每个todo条目添加对应的错误状态属性,比如idErrorState和titleErrorState,用来存储对应输入框的验证状态。如果是客户端模型,你可以在加载数据时初始化这些属性:
// 假设你是通过read方法获取数据 this.getModel("TripService").read("/todos", { success: (oResponse) => { oResponse.results.forEach(todo => { // 初始化为无错误状态 todo.idErrorState = sap.ui.core.ValueState.None; todo.titleErrorState = sap.ui.core.ValueState.None; }); this.getModel("TripService").setData(oResponse); } });
如果是OData模型,可以使用客户端扩展字段来添加这些属性,不会影响后端数据。
2. 绑定输入框的valueState到模型属性
修改工厂函数里的Input控件配置,把valueState绑定到刚添加的模型属性上,这样控件的状态会自动从模型读取:
function populateItems(sId: any, oContext: any) { const idInput = new Input({ value: "{TripService>id}", id: `id_${sId}`, valueState: "{TripService>idErrorState}", // 绑定模型中的错误状态 liveChange: onIdChange.bind(this) }); const titleInput = new Input({ value: "{TripService>title}", id: `title_${sId}`, valueState: "{TripService>titleErrorState}", // 绑定模型中的错误状态 liveChange: onTitleChange.bind(this) }); const urlInput = new Input({ value: "{TripService>url}" }); const tumbnailInput = new Input({ value: "{TripService>thumbnailUrl}" }); var row = new ColumnListItem(sId, { cells: [idInput, titleInput, urlInput, tumbnailInput] }); return row; }
3. 修改liveChange事件,更新模型中的状态
不再直接给控件设置状态,而是通过绑定上下文更新模型里的错误状态属性,这样模型会自动同步到控件:
function onIdChange(oEvent: any) { const oInput = oEvent.getSource(); const oContext = oInput.getBindingContext("TripService"); // 更新模型中的错误状态 oContext.setProperty("idErrorState", sap.ui.core.ValueState.Error); } function onTitleChange(oEvent: any) { const oInput = oEvent.getSource(); const oContext = oInput.getBindingContext("TripService"); oContext.setProperty("titleErrorState", sap.ui.core.ValueState.Error); }
效果验证
这样修改后,不管表格怎么重渲染(比如滚动加载更多数据、切换控件触发DOM更新),控件都会从模型中读取错误状态,红色边框会一直保留,直到你把模型中的状态改回None。
如果需要实现更复杂的跨字段验证,也可以在模型层面编写逻辑,比如当多个字段不符合规则时,批量更新对应的错误状态属性,同样能保证状态不会丢失。
内容的提问来源于stack exchange,提问作者Atul Chaudhary
相关产品推荐
相关产品推荐

