You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储对象后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:37:45