每次用户访问页面时如何刷新以前绑定的实体
How to refresh previously bound entity every time user visits the page
我刚刚 运行 遇到了一个我不确定如何解决的问题。
背景:我的应用有两个视图:
- 第一个输入数字,
- 第二个看详情
视图切换到详细视图后,我会调用 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
,因为稍后我需要模型的一些属性。这就是我绑定到视图以便所有内容都可用的原因。
我的想法是在读取方法的成功方法中编辑绑定。我想删除周围的元素。你有什么想法,如何做到这一点?甚至一个simpler/better的想法来解决我的遗憾?
编辑:
我忘了提到 refresh
方法。这是可能的,但我必须把它放在哪里?我不想调用后端两次。
只需调用 API myODataModel<strong>.invalidateEntry(<em><key></em>)</strong>
在绑定上下文之前,以便检索最新数据。
// after $metadata loaded..
const model = this.getOwnerComponent().getModel("odata");
const key = model.createKey(/*...*/) //See
model.invalidateEntry(key); // <-- before binding
this.getView().bindElement({
path: "odata>/" + key,
// ...
});
来自https://embed.plnkr.co/b0bXJK?show=controller/Detail.controller.js,preview
invalidateEntry
doc
Invalidate a single entry in the model data.
Mark the selected entry in the model cache as invalid. Next time a context binding or list binding is done, the entry will be detected as invalid and will be refreshed from the server.
我刚刚 运行 遇到了一个我不确定如何解决的问题。
背景:我的应用有两个视图:
- 第一个输入数字,
- 第二个看详情
视图切换到详细视图后,我会调用 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
,因为稍后我需要模型的一些属性。这就是我绑定到视图以便所有内容都可用的原因。
我的想法是在读取方法的成功方法中编辑绑定。我想删除周围的元素。你有什么想法,如何做到这一点?甚至一个simpler/better的想法来解决我的遗憾?
编辑:
我忘了提到 refresh
方法。这是可能的,但我必须把它放在哪里?我不想调用后端两次。
只需调用 API myODataModel<strong>.invalidateEntry(<em><key></em>)</strong>
在绑定上下文之前,以便检索最新数据。
// after $metadata loaded..
const model = this.getOwnerComponent().getModel("odata");
const key = model.createKey(/*...*/) //See
model.invalidateEntry(key); // <-- before binding
this.getView().bindElement({
path: "odata>/" + key,
// ...
});
来自https://embed.plnkr.co/b0bXJK?show=controller/Detail.controller.js,preview
invalidateEntry
docInvalidate a single entry in the model data.
Mark the selected entry in the model cache as invalid. Next time a context binding or list binding is done, the entry will be detected as invalid and will be refreshed from the server.