SAPUI5 ODataV2绑定Popover时dataRequested/dataReceived事件未触发
异常触发原因及修复方案
以下是该问题的几类核心触发原因,按排查优先级排序:
- 回调上下文绑定缺失:你当前代码中的
dataRequested回调没有绑定当前视图的this上下文,即使事件触发也会直接抛出oMessageView未定义的报错,如果你未捕获控制台报错会误以为事件没有触发。首先需要给dataRequested回调补上bind(this)。 - 绑定模型不匹配:
bindElement方法默认会绑定到控件继承到的默认模型,如果你当前获取的上下文来自指定名称的非默认OData模型,会导致绑定指向错误的模型,事件自然无法触发。建议显式指定上下文所属的模型名称,避免继承异常。 - Batch请求合并拦截:ODataModel 2.0默认会将同窗口期内的多个请求合并为单个Batch请求,此时单个绑定级别的
dataRequested/dataReceived事件不会触发,只有全局模型级别的对应事件会被触发。 - 客户端缓存命中:如果当前绑定路径的全量属性已经存在于客户端模型缓存中,ODataModel不会发起新的服务请求,两个事件也不会触发。可以通过添加
refresh: true参数强制发起请求验证是否为缓存导致。
修正后参考代码
var oSource = oEvent.getSource(); var oContext = oSource.getBindingContext(); var oBindModel = oContext.getModel(); var sModelName = oBindModel.getName(); // 绑定前直接开启加载状态可规避事件不触发的加载展示问题 this.oMessageView.setBusy(true); this._oPopover.bindElement({ path: oContext.getPath(), model: sModelName, parameters: { refresh: true // 按需添加,强制跳过缓存发起请求 }, events: { dataRequested: function () { this.oMessageView.setBusy(true); }.bind(this), dataReceived: function (e) { this.oMessageView.setBusy(false); }.bind(this), // 兜底:绑定完成后无论是否触发请求都关闭加载状态 change: function () { this.oMessageView.setBusy(false); }.bind(this) } }); this._oPopover.openBy(oSource);
如果确认是Batch合并导致的事件无法触发,可以改用监听oBindModel.attachDataReceived全局事件,判断返回数据的路径和当前绑定路径匹配后关闭加载状态即可。
内容的提问来源于stack exchange,提问作者Andreas Pöschl
相关产品推荐
相关产品推荐

