存储对象后flightbooking属性值异常变更,寻求获取原属性值方法
解决OData模型中关联实体延迟加载导致的属性值变化问题
这是SAP UI5 OData开发里很常见的延迟加载“坑”,我来帮你理清楚原因和解决办法:
为什么会出现这个情况?
SAP UI5的OData v2模型默认会对关联实体采用延迟加载策略:
- 当你直接
console.log(myObj)时,浏览器控制台会展示对象的初始快照,此时flightbooking只是一个带有__ref的引用标记,还没触发后端请求; - 但当你主动访问
myObj.flightbooking时,模型会立刻发起异步请求去后端拉取这个关联实体的数据,同时把flightbooking属性替换成__deferred对象,用来标记该数据正在加载中。
三种解决办法
1. 主动调用模型的read方法加载关联数据
如果你需要单独获取flightbooking的数据,可以直接用模型的read API指定关联路径:
const oModel = window.detail.getView().getModel(); const sFlightBookingPath = `FlightCollection(carrid='${this._carrid}',connid='${this._connid}',fldate=datetime'${this._fldate}')/flightbooking`; oModel.read(sFlightBookingPath, { success: (oBookingData) => { console.log("完整的flightbooking数据:", oBookingData); // 这里可以把oBookingData存入变量后续使用 }, error: (oError) => { console.error("加载flightbooking失败:", oError); } });
2. 获取主实体时通过$expand一次性加载关联数据
如果你的业务场景需要同时用到主实体和flightbooking的数据,可以在获取主实体时加上$expand参数,让后端一次性返回关联数据:
const oModel = window.detail.getView().getModel(); const sFullPath = `FlightCollection(carrid='${this._carrid}',connid='${this._connid}',fldate=datetime'${this._fldate}')?$expand=flightbooking`; oModel.read(sFullPath, { success: (oFullData) => { console.log("包含flightbooking的完整主实体数据:", oFullData); console.log("直接访问flightbooking:", oFullData.flightbooking); // 此时就能拿到完整的实体数据了 } });
3. 调试时冻结对象快照(仅用于查看)
如果只是想在控制台查看原始的__ref内容,不需要实际加载数据,可以在console.log后加一个断点,阻止模型触发延迟加载:
var myObj = window.detail.getView().getModel().oData["FlightCollection(carrid='" + this._carrid + "',connid='" + this._connid + "',fldate=datetime'" + this._fldate + "')"]; console.log("myObj: ", myObj); debugger; // 触发断点后,在控制台查看myObj.flightbooking就能看到原始的__ref console.log("myObj.flightbooking: ", myObj.flightbooking);
内容的提问来源于stack exchange,提问作者user9254958
相关产品推荐
相关产品推荐

