You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

UI5技术问题:如何获取模型中新创建对象的绑定路径

解决主-详情场景中新增对象的bindElement路径问题

这问题我做SAP UI5项目时也碰到过,太懂那种找不到路径的抓狂感了!咱们一步步来拆解解决办法:

核心问题原因

列表项点击时能拿到BindingContext,是因为列表控件已经把每个项和模型里的对应数据做了绑定,所以能通过context.getPath()拿到对应路径;但新增对象时,它刚被加到模型里,还没和任何UI控件绑定,自然没有现成的BindingContext可用,而且UI5确实没有findPath()这种直接根据对象找路径的方法。

针对JSON模型的解决方案(你的代码用的是JSON模型)

因为你是把新对象直接加到模型的根数组里,所以可以通过数组索引直接构造路径,这是最直接的办法:

// click handler for "add" button
var newStuff = {
  propA: "foo",
  propB: 13
};
// 先获取当前模型数据,用push添加新对象(比concat更高效,直接修改原数组)
var currentData = oModel.getData();
currentData.push(newStuff);
// 更新模型数据
oModel.setData(currentData);
// 新对象的索引是数组长度减1,直接构造绑定路径
var newItemPath = "/" + (currentData.length - 1);
// 绑定到详情页
oDetailPage.bindElement(newItemPath);
oApp.toDetail(oDetailPage);

注意点

如果你的模型根结构不是直接的数组,而是嵌套在对象里(比如{ items: [...] }),那路径要改成"/items/" + (currentData.items.length - 1),根据你的实际模型结构调整即可。

针对OData模型的额外方案(如果后续切换到OData场景)

如果用的是OData模型,推荐用createEntry方法,它会自动创建带路径的绑定上下文,非常省心:

// click handler for "add" button
var oContext = oModel.createEntry("/YourEntitySet", {
  properties: {
    propA: "foo",
    propB: 13
  }
});
// 直接用上下文的路径绑定
oDetailPage.bindElement(oContext.getPath());
oApp.toDetail(oDetailPage);
// 后续保存时调用submitChanges即可提交新增数据
// oModel.submitChanges();

这样不管是新增还是编辑,都能统一用绑定上下文的方式处理,代码更规整。

内容的提问来源于stack exchange,提问作者maillard

火山引擎 最新活动