如何在SAP UI5中通过submitChanges()提交Deep Entity?
SAP UI5 实现嵌套Items的Order深度实体单次提交
以下是适配你场景的具体实现步骤,确保单次提交包含嵌套Items的Order实体并触发后端事务一致性处理:
1. 配置OData模型支持批处理与双向绑定
首先确保OData V2模型启用批处理(批量提交的基础),同时设置双向绑定以自动跟踪所有数据变更:
// 在控制器/组件初始化时创建模型 const oODataModel = new sap.ui.model.odata.v2.ODataModel({ serviceUrl: "/sap/opu/odata/sap/YOUR_ORDER_SERVICE/", useBatch: true, // 必须启用批处理,打包所有变更为单次请求 defaultBindingMode: sap.ui.model.BindingMode.TwoWay // 自动捕获数据修改 }); this.getView().setModel(oODataModel);
2. 正确绑定Order与Items的上下文
- Order表格绑定:将表格直接绑定到Order实体集,每行上下文对应单个Order实例,支持订单属性的直接编辑:
<Table id="orderTable" items="{/OrderSet}"> <columns> <Column><Text text="订单ID"/></Column> <Column><Text text="订单日期"/></Column> </columns> <items> <ColumnListItem> <cells> <Text text="{OrderId}"/> <Input value="{OrderDate}"/> <!-- 双向绑定实现订单属性更新 --> <Button text="管理订单项" press=".onManageItems"/> </cells> </ColumnListItem> </items> </Table>
- Items弹窗绑定:点击"管理订单项"时,将当前Order的上下文传递给弹窗,弹窗内列表直接绑定到Order的
Items导航属性(相对绑定无需硬编码路径):
// 控制器中打开弹窗的方法 onManageItems: function(oEvent) { const oOrderCtx = oEvent.getSource().getBindingContext(); const oItemsDialog = this.getView().byId("itemsManagementDialog"); oItemsDialog.setBindingContext(oOrderCtx); // 关联当前订单上下文 oItemsDialog.open(); }
弹窗片段的Items列表绑定示例:
<!-- 弹窗内的Items维护列表 --> <List id="itemsList" items="{Items}"> <StandardListItem> <cells> <Input value="{ItemName}"/> <Input value="{Quantity}" type="Number"/> <Button icon="sap-icon://delete" press=".onDeleteItem"/> </cells> </StandardListItem> </List> <Button text="添加订单项" press=".onAddItem"/>
3. 实现Items的增删操作
- 添加订单项:基于当前Order的上下文创建关联的Items实体条目,模型自动标记为待创建的变更:
onAddItem: function() { const oOrderCtx = this.getView().byId("itemsManagementDialog").getBindingContext(); const oModel = this.getView().getModel(); // 创建属于当前订单的新订单项 oModel.createEntry(oOrderCtx.getPath() + "/Items", { properties: { ItemName: "", Quantity: 1 // 根据实体结构补充默认属性 } }); }
- 删除订单项:基于当前Item的上下文标记删除操作:
onDeleteItem: function(oEvent) { const oItemCtx = oEvent.getSource().getBindingContext(); const oModel = this.getView().getModel(); oModel.deleteEntry(oItemCtx); }
4. 单次提交所有变更
点击提交按钮时,直接调用模型的submitChanges方法,模型会自动收集所有Order更新、Items增删改的变更,生成包含深度实体结构的批请求发送给网关:
onSubmitAllChanges: function() { const oModel = this.getView().getModel(); oModel.submitChanges({ success: function(oResponse) { sap.m.MessageToast.show("所有变更已成功提交"); oModel.refresh(); // 刷新数据同步后端状态 }, error: function(oError) { const sErrMsg = oError.responseText ? JSON.parse(oError.responseText).error.message.value : oError.message; sap.m.MessageBox.error(`提交失败:${sErrMsg}`); } }); }
关键注意事项
- 确认OData服务元数据中,Order实体的
Items导航属性已配置为可写(Gateway中需开启导航属性的CRUD权限) - 所有数据操作必须依赖模型的上下文跟踪,不要手动调用
update/create/delete方法,否则会破坏批量提交的事务性 - 网关端已配置深度实体事务,因此
submitChanges发送的批请求会触发后端原子性处理:订单操作失败时,关联的Items变更自动回滚
内容的提问来源于stack exchange,提问作者Fahmi Eshaq
相关产品推荐
相关产品推荐

