OData V4更改未在其他绑定中反映出来

Flo*_*Flo 11 odata sapui5

我创建了一个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上绑定更改事件吗?

Bog*_*ann 5

https://embed.plnkr.co/qatUyq/?show=preview:%3Fsap-ui-xx-componentPreload%3Doff

https://embed.plnkr.co/qatUyq/ 使用 OData V4 TripPin服务的最小示例

请记住,这v4.ODataModel仍在进行中。的同步模式必须是"None"目前。

同步模式

控制不同绑定之间的同步,这些绑定引用相同数据以用于一个绑定中的案例数据更改。必须设置为“无”,这意味着绑定根本不同步[...]。

更新:根据UI5 路线图(需要 SAP 社区帐户),数据绑定同步支持“计划于 2021 年第二季度”。

因此,应用程序本身必须识别相关绑定并手动刷新它们。为了提高效率,我们可以通过批处理组 ID 将此类 GET 请求与更新请求一起发送,这是v2.ODataModel自动执行的操作(除非refreshAfterChange被禁用)。

在上面的示例中,我使用了以下设置和 API:

  1. $$updateGroupId: "myGroupId" 用于上下文绑定(详细信息页面)。
  2. 用户按下 后Submitrefresh("myGroupId")从列表绑定(主列表)调用。
  3. 最后submitBatch("myGroupId")

如果我们随后检查请求负载,我们可以看到 PATCH 和 GET 请求捆绑在一起。因此,主列表同时被刷新。


问答

  1. 中的默认绑定模式是v4.ODataModel什么?

    • 它是"TwoWay"(除非sharedRequests已启用)- UI 更改模型数据,反之亦然。当更改存储在批处理队列中时,立即将相应的请求发送到后端。
  2. 我怎么知道我是否在使用批处理模式?

    • v4 中的几乎所有绑定以及模型本身都支持$$groupId读取参数,并且某些绑定支持$$updateGroupId更新请求。
      • 如果 ID 设置为"$direct",则直接发送相应的请求,不进行批量处理。这些请求更容易被浏览器诊断和缓存
      • 如果 ID 是自定义字符串(如上例所示),则相应的请求将由 API 显式发送submitBatch
      • 如果没有定义此类 ID,则默认值设置为"$auto",这意味着默认情况下,在所有相关控件重新呈现后,请求将自动批量发送。
    • 查看文档主题Batch Control
  3. 即使这两个请求(GET 和 PATCH)捆绑在一起,应用程序如何确保在更新完成后始终应用刷新列表?

    • 该模型已经解决了这个问题:

      OData V4 模型自动将所有GET 请求放入单个更改集,该更改集位于批处理请求的开头。所有 GET 请求都放在它之后

  4. 为什么我可以submitBatch在没有像之前那样将组添加到“延迟组”的情况下进行呼叫v2.ODataModel

    • V4 简化了批处理组的处理:

      应用程序组默认是延迟的;无需设置或获取延迟组。您只需要submitBatch模型上的方法来控制批处理的执行。[文档]

  5. 模型通常支持诸如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