为什么无法刷新模型?

问题描述 投票:1回答:2

[也许我不太了解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模型进行绑定。可以。.现在,例如,[[添加或删除函数:

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或其他操作时。我是否了解或做错了什么?

sapui5
2个回答
1
投票
您的JSONModel未连接任何东西。这只是一堆JSON数据。因此,如果您告诉它刷新,它应该如何知道从哪里获取新数据?

什么refresh

不做正在获取新数据。

refresh实际执行的操作(在JSONModel中)是告诉绑定它具有新数据。例如,这些绑定之一可以是sap.m.List的项目。然后,列表知道需要重新渲染以显示新数据。

如果您不获取新数据并调用刷新,则不会发生任何事情。实际数据仍然相同。

我可以采取一种变通方法来调用一个读取老化的odata服务的函数,但这并不是真正的美满的事物

首先,当您已经拥有非常好的ODataModel时,使用额外的JSONModel并不是一件很漂亮的事情。如果只是删除JSONModel并将视图绑定到ODataModel,则视图将在调用remove后自动更新。


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

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

不要忘记从单元格中删除detailView。>>

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

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

客户端模型

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

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

    不是

  • 知道任何服务器端数据,它们不应该知道,因为这不是他们的目的。
[当处理符合特定规范的远程数据提供者时(例如

OData

FHIR),应使用适当的服务器端模型代替服务器端模型

服务器端模型,例如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向服务发送请求:

ODataListBinding

请求成功后,列表将相应显示实体。之后,当调用https://....svc/MyEntitySet?$filter=ThatProperty eq 'something'时,相应的列表将自动刷新。


TL; DR

我是否了解或做错了什么?

是。在这种情况下,具有中间myODataModel.remove(...);是一种常见的反模式,因此维护成本很高。尝试仅使用JSONModel。该框架将为您完成工作。


0
投票
您正在将客户端模型(JSONModel)与服务器端模型(ODataModel)混合,希望它们能够同步。
© www.soinside.com 2019 - 2024. All rights reserved.