首页 > 解决方案 > 每次用户访问页面时如何刷新先前绑定的实体

问题描述

我刚刚遇到了一个不知道如何解决的问题。

背景:我有一个有两个视图的应用程序:

视图切换到详细视图后,我会调用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方法。这是可能的,但我必须把它放在哪里?我不想调用后端两次。

标签: odatasapui5sap-fiori

解决方案


只需在绑定上下文之前调用 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文档

使模型数据中的单个条目无效。

将模型缓存中的选定条目标记为无效。下次完成上下文绑定或列表绑定时,该条目将被检测为无效并从服务器刷新。


推荐阅读