我刚遇到一个不确定如何解决的问题。
背景:我有一个具有两个视图的应用:
视图切换到详细视图后,我将调用bindElement()
从后端获取数据。
_onRoutePatternMatched: function(oEvent) {
// ...
this.getView().bindElement({
path: "/EntitySet('" + id+ "')"
});
},
问题在于ID通常是相同的,因此,仅当ID与上次调用不同时,该方法才会调用后端。
因此,我尝试使用以下方法解决问题:
this.getView().getModel().read("/EntitySet('" + id+ "')",{
success: function(oData, response) {
that.getView().setModel(oData, "");
}
});
通过这种方式,数据始终是最新的。但是现在的绑定有些不同。
与bindElement()
绑定:
{
"id": "1234",
"propety1": "abc",
// ...
}
绑定setModel()
和id = 1234
:
{
"EntitySet('1234')": {
"id": "1234",
"propety1": "abc",
// ...
}
}
第一种方式,我的绑定看起来像这样:
<ObjectHeader title="{id}">
现在,它必须看起来像这样:
<ObjectHeader title="{/EntitySet('1234')/id}">
在这里,我有一个问题,因为id
(在这种情况下为1234
)的值将始终是不同的,因此绑定将不起作用。我无法直接绑定到ObjectHeader
,因为稍后我将需要模型中的一些属性。这就是我将视图绑定到所有视图的原因。
我的想法是在read方法的成功方法内编辑绑定。我想删除周围的元素。你有一个主意,怎么做?或更简单/更好的主意来解决我的遗憾?
编辑:
我忘了提到refresh
方法。这是可能的,但是我必须放在哪里?我不想两次调用后端。
答案 0 :(得分:2)
在绑定上下文之前只需调用API myODataModel.invalidateEntry(<key>)
即可检索最新数据。
// after $metadata loaded..
const model = this.getOwnerComponent().getModel("odata");
const key = model.createKey(/*...*/) //See https://stackoverflow.com/a/47016070/5846045
model.invalidateEntry(key); // <-- before binding
this.getView().bindElement({
path: "odata>/" + key,
// ...
});
来自https://embed.plnkr.co/b0bXJK?show=controller/Detail.controller.js,preview
invalidateEntry
doc使模型数据中的单个条目无效。
在模型缓存中将所选条目标记为无效。 下一次上下文绑定或列表绑定完成时,该条目将被检测为无效并将从服务器刷新。