SAPUI5中ODataModel执行DELETE时触发两次请求问题咨询
这种重复触发DELETE请求的问题我之前在做SAPUI5项目时也碰到过,多半是事件触发逻辑或者ODataModel的配置/调用方式出了问题,咱们一步步来排查解决:
第一步:确认事件处理函数是否被调用两次
先在你的_handleIconPressDelete方法里加个日志输出,看看这个方法是不是被触发了两次:
_handleIconPressDelete: function(oEvent) { console.log("Delete handler triggered at", new Date().toISOString()); // 加这句日志 // 你的原有代码 }
如果控制台打印了两次日志,那问题出在事件触发层面;如果只打印一次,但网络请求发了两次,那问题在ODataModel的请求发送逻辑。
如果是事件触发两次:解决控件/事件绑定问题
1. 阻止事件冒泡与默认行为
FeedListItem的iconPress事件可能会因为控件的内部状态变化(比如iconActive="true"的状态切换)或者事件冒泡导致重复触发,试试在事件处理函数开头加上阻止传播的代码:
_handleIconPressDelete: function(oEvent) { oEvent.stopPropagation(); // 阻止事件向上冒泡 oEvent.preventDefault(); // 阻止控件的默认行为 console.log("Delete handler triggered"); // 后续删除逻辑 var oContext = oEvent.getSource().getBindingContext(); this.getView().getModel().remove(oContext.getPath(), { success: () => { // 删除成功后的列表更新逻辑 }, error: (oErr) => console.error("Delete failed:", oErr) }); }
2. 检查是否重复绑定事件
确认你的控制器里有没有额外通过JS代码绑定iconPress事件,比如在onInit里重复写了:
// 错误示例:XML视图已经绑定了iconPress,JS里又绑一次 this.byId("yourFeedListItem").attachIconPress(this._handleIconPressDelete, this);
这种情况会导致事件触发两次,去掉重复的JS绑定即可。
如果是方法只调用一次,但请求发两次:解决ODataModel配置问题
1. 检查Batch模式与submitChanges调用
SAPUI5的ODataModel(v2)默认开启Batch模式,remove方法会把请求加入Batch队列,默认配置下autoSubmit为true,调用remove后会自动提交请求。如果你的代码里不小心手动调用了两次submitChanges,就会发送两次请求:
// 错误示例:两次submitChanges导致重复请求 this.getView().getModel().remove(sPath); this.getView().getModel().submitChanges(); this.getView().getModel().submitChanges(); // 多余的调用
或者,是不是在remove的success回调里又调用了submitChanges?这种情况下去掉多余的submitChanges调用即可。
2. 检查是否开启了重复请求的重试机制
有些项目里可能给ODataModel配置了请求重试逻辑,比如自定义的错误处理里自动重试DELETE请求,导致重复发送。检查你的Model初始化代码或者全局的OData配置,看看有没有相关的重试逻辑。
额外排查点:SelectDialog的列表更新逻辑
删除收藏项后,你是不是重新绑定了SelectDialog的列表?比如调用了oSelectDialog.getBinding("items").refresh()或者重新设置了绑定路径?如果刷新逻辑不当,可能会导致控件重新渲染,间接触发事件或者重复发送请求。建议删除成功后,依赖ODataModel的双向绑定自动更新列表,不需要手动刷新整个列表。
内容的提问来源于stack exchange,提问作者hy13

