我创建了一个UI5主 - 详细信息页面:
<List items="{som>/Users}">
<StandardListItem
type="Navigation"
press="onItemPress"
title="{som>UserName}"
/>
</List>
onItemPress: function(oEvent) {
var oUserContext = oEvent.getSource().getBindingContext("som");
var oUser = oUserContext.getObject();
this.getRouter().navTo("userDetails", {userId: oUser.Id});
}
onInit: function () {
var route = this.getRouter().getRoute("userDetails");
route.attachPatternMatched(this._onObjectMatched, this);
},
_onObjectMatched: function (oEvent) {
var sUserId = oEvent.getParameter("arguments").userId;
this.getView().bindElement({
path: "som>/Users('"+sUserId+"')",
model: "som"
});
},
reload: function() {
this.getView().getModel("som").refresh();
},
<fLayout:SimpleForm id="userForm">
<Button text="reload" press="reload"/>
<Label text="{i18n>settings.user.id}"/>
<Input editable="false" value="{som>Id}"/>
<Label text="{i18n>settings.user.username}"/>
<Input value="{som>UserName}"/>
<Label text="{i18n>settings.user.email}"/>
<Input value="{som>Email}"/>
<Label text="{i18n>settings.user.firstname}"/>
<Input value="{som>FirstName}"/>
<Label text="{i18n>settings.user.lastname}"/>
<Input value="{som>LastName}"/>
</fLayout:SimpleForm>
一切都很好。但是当我在详细信息视图中更改用户时,它正在更新但不在主视图中!使用重载方法,我可以手动刷新它。但是如何在更改后自动触发?我可以在SimpleForm上绑定更改事件吗?
答案 0 :(得分:3)
以下是一个工作示例:https://embed.plnkr.co/qatUyq/?show=preview
我们需要记住,v4.ODataModel仍在进行中。例如。同步模式当前必须为"None"
。
synchronizationMode
控制不同绑定之间的同步,这些绑定引用一个绑定中的案例数据更改的相同数据。必须设置为“无”&#39;这意味着绑定根本不会同步 [...]。
因此,应用程序本身必须识别相关的绑定并手动刷新它们。为了提高效率,我们可以通过批处理组ID发送此类GET请求以及更新请求,这是v2.ODataModel自动执行的操作(除非refreshAfterChange
被禁用)。
在上面的示例中,我使用了以下设置和API:
$$updateGroupId: "myGroupId"
代表context binding(详情页面)refresh("myGroupId")
list binding(主列表)submitBatch("myGroupId")
。如果我们检查请求有效负载,我们可以看到PATCH and GET requests are bundled在一起。因此,主列表会同时刷新。
v4.ODataModel中的默认绑定模式是什么?
"TwoWay"
- 用户界面会更改模型数据,反之亦然。如果更改不存储在批处理队列中,则会立即发送相应的请求。我如何知道我是否使用批处理模式?
$$groupId
,某些绑定支持更新请求$$updateGroupId
。
"$direct"
,则相应的请求将直接发送而不会批量处理。这些请求更容易被浏览器诊断和cacheable。submitBatch
显式发送。"$auto"
,这意味着默认情况下,当相应的控件被渲染(重新)时,请求会自动作为批处理发送。OData V4模型会自动将所有非 GET请求放入单个更改集中,该更改集位于批处理请求的开头。所有GET请求都放在它之后。
submitBatch
&#34;事先就像我用v2.ODataModel做的那样?
应用程序组默认延迟;无需设置或获取延迟组。您只需要模型上的
submitBatch
方法来控制批处理的执行。 [src]
requestSent
和requestCompleted
等事件。为什么我不能在v4.ODataModel中使用它们?
[...]附加事件处理程序会导致错误。
希望我能说清楚一些事情。有关UI5中OData V4的最新文档,请参阅:https://openui5nightly.hana.ondemand.com/#/topic/5de13cf4dd1f4a3480f7e2eaaee3f5b8
答案 1 :(得分:0)
V4模型与诺言合作。
提交更改时,您可以使用.then(),以便刷新模型。
...
var oView = this.getView();
function refreshModel() {
oView.getModel().refresh();
}
oView.getModel().submitBatch(sGroupId).then(refreshModel);
...
https://sapui5.hana.ondemand.com/#/api/sap.ui.model.odata.v4.ODataModel/methods/submitBatch