每次用户访问页面时如何刷新先前绑定的实体

时间:2019-12-18 16:58:54

标签: odata sapui5 sap-fiori

我刚遇到一个不确定如何解决的问题。

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

  • 第一个输入数字,
  • 第二个查看详细信息。

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

1 个答案:

答案 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

     

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

     

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