Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sapui5 为什么模型上的刷新不起作用?_Sapui5 - Fatal编程技术网

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

Sapui5 为什么模型上的刷新不起作用?,sapui5,Sapui5,也许我真的不理解this.getView().getModel().refresh(true)或updateBindings。。不知怎的,它没有刷新模型,或者我的主要想法是错误的。我是说;我可以做一个变通方法来调用再次读取odata服务的函数,但这并不是很好。因此,我阅读了onInit中的模型 onInit:function(){ var=这个; var oViewModel=new sap.ui.model.json.JSONModel({}); this.getView().setModel

也许我真的不理解
this.getView().getModel().refresh(true)
updateBindings
。。不知怎的,它没有刷新模型,或者我的主要想法是错误的。我是说;我可以做一个变通方法来调用再次读取odata服务的函数,但这并不是很好。因此,我阅读了onInit中的模型

onInit:function(){
var=这个;
var oViewModel=new sap.ui.model.json.JSONModel({});
this.getView().setModel(oViewModel,“detailView”);
setModel(oViewModel,“detailView”);
过滤器的var=[];
var zAppFilter=new sap.ui.model.Filter(“XXX”,sap.ui.model.FilterOperator.EQ,“XXXX”);
过滤器推送(zAppFilter);
var oModel=that.getView().getModel();
setDefaultBindingMode(“双向”);
oModel.read(“/XXXXSet”{
过滤器:OFFILTER,
成功:功能(oData){
getView().getModel(“detailView”).setData(oData.results);
},
// ...
});
},
我在视图中使用这个
“detailView”
-JSONModel模型进行绑定。这很有效。。现在,添加或删除功能,例如:

onDelete:函数(oEvent){
var=这个;
var oModel=this.getOwnerComponent().getModel();
var oSelectedItem=oEvent.getSource().getParent();
var oSourceID=oSelectedItem.getBindingContext(“detailView”).getObject().Zid;
oModel.remove(“/XXX(XXX='XXX',XXXX='”+XXXX+”)”{
方法:“删除”,
成功:功能(数据){
.getView().getModel(“detailView”).refresh(true);
sap.ui.getCore().getModel(“detailView”).refresh(true);
},
// ...
});
},

这不起作用。但为什么?我的意思是当我做
更新索引
或其他事情时。我是否理解或做错了什么?

您的JSONModel没有连接到任何东西。这只是一堆JSON数据。因此,如果您让它刷新,它应该如何知道从何处获取新数据

refresh
没有做的事情是获取新数据

refresh
实际上(在JSONModel中)告诉绑定它有新数据。例如,其中一个绑定可以是
sap.m.List
的项。然后列表知道需要重新排序以显示新数据

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

我可以做一个变通方法来调用读取odata服务的函数,但这并不是真正的beautyfull

当你已经有了一个非常好的ODataModel时,使用一个额外的JSONModel从一开始就是不漂亮的。如果您刚刚删除了JSONModel并将视图绑定到ODataModel,那么在调用
remove
后,视图将自动更新


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

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


不要忘记从计算单元中删除详细视图。

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

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

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

  • 设备模型通过
    JSONModel
    提供有关用户设备及其状态的信息
  • ResourceModel
    为i18n目的提供客户端可翻译的UI文本
  • 从UI或应用程序同步状态
这里的模型不知道任何服务器端数据,它们不应该知道,因为这不是它们的目的

当与符合特定规范(例如OData或)的远程数据提供程序打交道时,应使用适当的服务器端模型

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

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


这将创建一个实例,该实例将使用以下URL向服务发送请求:

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

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


TL;博士 我是理解还是做错了什么

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