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




