为什么模型上的刷新不起作用?

Why the refresh on the model does not work?

可能是我不太理解this.getView().getModel().refresh(true)updateBindings.. 不知何故它没有刷新模型,或者我的主要想法是错误的。我是说;我可以做一个解决方法来调用一个函数来再次读取 odata 服务,但这并不是很漂亮。所以,我阅读了 onInit

中的模型
onInit: function () {
  var that = this;
  var oViewModel = new sap.ui.model.json.JSONModel({});
  this.getView().setModel(oViewModel, "detailView");
  sap.ui.getCore().setModel(oViewModel,"detailView");
  var oFilter = [];
  var zAppFilter = new sap.ui.model.Filter("XXX", sap.ui.model.FilterOperator.EQ, "XXXX");
  oFilter.push(zAppFilter);
  var oModel = that.getView().getModel();
  oModel.setDefaultBindingMode("TwoWay");
  oModel.read("/XXXXSet", {
    filters: oFilter,
    success: function (oData) {
      that.getView().getModel("detailView").setData(oData.results);
    },
    // ...
  });
},

我在我的视图中使用此 "detailView"-JSONModel 模型进行绑定。这有效.. 现在,adddelete 函数例如:

onDelete: function (oEvent) {
  var that = this;
  var oModel = this.getOwnerComponent().getModel();
  var oSelectedItem = oEvent.getSource().getParent();
  var oSourceID = oSelectedItem.getBindingContext("detailView").getObject().Zid;
  oModel.remove("/XXX(XXX='XXX',XXXX='" + XXXX+ "')", {
    method: "DELETE",
    success: function(data) {
      that.getView().getModel("detailView").refresh(true);
      sap.ui.getCore().getModel("detailView").refresh(true);
    },
    // ...
  });
},

那行不通..但是为什么呢?我的意思是当我做 updateBindings 或其他事情时。我是理解错了还是做错了什么?

您的JSON模型没有连接到任何东西。这只是一堆 JSON 数据。所以如果你告诉它刷新,它怎么知道从哪里获取新数据?

refresh不做的事情正在获取新数据。

refresh 实际上(在 JSON 模型中)所做的是告诉绑定它有新数据。例如,这些绑定之一可以是 sap.m.List 的项目。然后列表知道它需要重新呈现以显示新数据。

如果您不获取新数据并调用刷新,则不会发生任何事情。实际数据还是一样

i can do a workaround to call a function that reads agean the odata service but this is not really beautyfull

好吧,当您已经拥有完美的 ODataModel 时使用额外的 JSONModel 从一开始就不是很漂亮。如果您刚刚删除 JSONModel 并将视图绑定到 ODataModel,则视图会在调用 remove.

后自动更新

要将视图绑定到您的 ODataModel,您可以从

开始
<Table id="table0" items="{/XXXXSet}">

别忘了从您的单元格中删除 detailView

您将客户端模型 (JSONModel) 与服务器端模型 (ODataModel) 混合在一起,希望它们同步。

客户端模型和服务器端模型是两个独立的模型,服务于两个不同的目的。

客户端模型

客户端模型的主要目的是提供和同步仅在应用程序运行时可用的数据。如果应用程序消失了,数据也就消失了。客户端模型的一些突出用例是:

  • 通过 JSONModel 提供的设备模型,它提供有关用户设备及其状态的信息。
  • ResourceModel 提供客户端可翻译 UI 文本用于 i18n 目的。
  • 正在从 UI 或应用程序
  • 同步状态

这里的模型知道任何服务器端数据,他们不应该知道,因为这不是他们的目的。

在处理符合特定规范(例如ODataFHIR)的远程数据提供者时,应使用适当的服务器端模型 而不是 .

服务器端模型

服务器端模型,例如 ODataModel,具有服务器感知的优势。 他们知道如何从后端系统获取、删除、更新、创建数据,甚至调用函数。它们可用于在客户端和服务器之间高效地共享状态。

怎么样?只需直接在绑定定义中使用服务器端模型即可。例如,以 OData 作为默认模型:

<List items="{
  path: '/MyEntitySet',
  filters: [
    {
      path: 'ThatProperty',
      operator: 'EQ',
      value1: 'something'
    }
  ]
}"> <!-- given "MyEntitySet", "ThatProperty", "EntityTitle", and "EntityDesc" are defined in $metadata -->
  <StandardListItem title="{EntityTitle}" description="{EntityDesc}" />
</List>

这将创建一个 ODataListBinding 实例,该实例将使用以下 URL:

向服务发送请求

https://....svc/MyEntitySet?$filter=ThatProperty eq 'something'

当请求成功后,列表会显示相应的实体。之后调用myODataModel.remove(...);时,会自动刷新对应的列表。


TL;DR

Am I understanding or doing something wrong?

是的。在这种情况下使用中间 JSONModel 是一种常见的反模式,会产生高维护成本。尝试仅使用 ODataModel。该框架将为您完成工作。