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

时间:2018-03-14 10:06:34

标签: odata sapui5

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

2 个答案:

答案 0 :(得分:3)

以下是一个工作示例:https://embed.plnkr.co/qatUyq/?show=preview

https://embed.plnkr.co/qatUyq/

我们需要记住,v4.ODataModel仍在进行中。例如。同步模式当前必须为"None"

  

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

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

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

  1. $$updateGroupId: "myGroupId"代表context binding(详情页面)
  2. 用户点击提交后,refresh("myGroupId") list binding(主列表)
  3. 最后submitBatch("myGroupId")
  4. 如果我们检查请求有效负载,我们可以看到PATCH and GET requests are bundled在一起。因此,主列表会同时刷新。

    Q&安培; A

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

      • It's "TwoWay" - 用户界面会更改模型数据,反之亦然。如果更改存储在批处理队列中,则会立即发送相应的请求。
    2. 我如何知道我是否使用批处理模式?

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

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

    4. 为什么我可以在不将群组添加到&#34;延迟群组的情况下拨打submitBatch&#34;事先就像我用v2.ODataModel做的那样?
      • V4简化了批处理组的处理:
          

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

    5. Model支持requestSentrequestCompleted等事件。为什么我不能在v4.ODataModel中使用它们?
      • 设计不支持:
          

        [...]附加事件处理程序会导致错误。

    6. 希望我能说清楚一些事情。有关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