我创建了一个UI5主 - 详细信息页面:
<List items="{som>/Users}">
<StandardListItem
type="Navigation"
press="onItemPress"
title="{som>UserName}"
/>
</List>
Run Code Online (Sandbox Code Playgroud)
onItemPress: function(oEvent) {
var oUserContext = oEvent.getSource().getBindingContext("som");
var oUser = oUserContext.getObject();
this.getRouter().navTo("userDetails", {userId: oUser.Id});
}
Run Code Online (Sandbox Code Playgroud)
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();
},
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
一切都很好.但是当我在详细信息视图中更改用户时,它正在更新但不在主视图中!使用重载方法,我可以手动刷新它.但是如何在更改后自动触发?我可以在SimpleForm上绑定更改事件吗?
见https://embed.plnkr.co/qatUyq/?show=preview:%3Fsap-ui-xx-componentPreload%3Doff
请记住,这v4.ODataModel
仍在进行中。的同步模式必须是"None"
目前。
同步模式
控制不同绑定之间的同步,这些绑定引用相同数据以用于一个绑定中的案例数据更改。必须设置为“无”,这意味着绑定根本不同步[...]。
更新:根据UI5 路线图(需要 SAP 社区帐户),数据绑定同步支持“计划于 2021 年第二季度”。
因此,应用程序本身必须识别相关绑定并手动刷新它们。为了提高效率,我们可以通过批处理组 ID 将此类 GET 请求与更新请求一起发送,这是v2.ODataModel
自动执行的操作(除非refreshAfterChange
被禁用)。
在上面的示例中,我使用了以下设置和 API:
$$updateGroupId: "myGroupId"
用于上下文绑定(详细信息页面)。refresh("myGroupId")
从列表绑定(主列表)调用。submitBatch("myGroupId")
。如果我们随后检查请求负载,我们可以看到 PATCH 和 GET 请求捆绑在一起。因此,主列表同时被刷新。
中的默认绑定模式是v4.ODataModel
什么?
"TwoWay"
(除非sharedRequests
已启用)- UI 更改模型数据,反之亦然。当更改未存储在批处理队列中时,立即将相应的请求发送到后端。我怎么知道我是否在使用批处理模式?
$$groupId
读取参数,并且某些绑定支持$$updateGroupId
更新请求。
"$direct"
,则直接发送相应的请求,不进行批量处理。这些请求更容易被浏览器诊断和缓存。submitBatch
。"$auto"
,这意味着默认情况下,在所有相关控件重新呈现后,请求将自动批量发送。即使这两个请求(GET 和 PATCH)捆绑在一起,应用程序如何确保在更新完成后始终应用刷新列表?
OData V4 模型自动将所有非GET 请求放入单个更改集,该更改集位于批处理请求的开头。所有 GET 请求都放在它之后。
为什么我可以submitBatch
在没有像之前那样将组添加到“延迟组”的情况下进行呼叫v2.ODataModel
?
应用程序组默认是延迟的;无需设置或获取延迟组。您只需要
submitBatch
模型上的方法来控制批处理的执行。[文档]
模型通常支持诸如requestSent
和 之类的事件requestCompleted
。为什么我不能使用它们v4.ODataModel
?
希望我把一些事情说得更清楚。可以在以下位置找到有关 UI5 中 OData V4 的最新文档:https ://openui5nightly.hana.ondemand.com/topic/5de13cf4dd1f4a3480f7e2eaaee3f5b8
小智 0
V4 模型的工作有希望。
提交更改时,您可以使用 .then(),这样您就可以刷新模型。
...
var oView = this.getView();
function refreshModel() {
oView.getModel().refresh();
}
oView.getModel().submitBatch(sGroupId).then(refreshModel);
...
Run Code Online (Sandbox Code Playgroud)
https://sapui5.hana.ondemand.com/#/api/sap.ui.model.odata.v4.ODataModel/methods/submitBatch
归档时间: |
|
查看次数: |
1026 次 |
最近记录: |