How to Request Entries Automatically in x Seconds Intervals

时间:2018-02-03 10:19:21

标签: sapui5

In an XML view, I present a sap.m.Table with entries from an output ODataModel. Now the first 8 entries should be output for about 5 seconds and the remaining entries automatically reload, and switch in 5 second intervals, like a dashboard.

Here is an example: I have 30 entries.

  1. At the beginning → Show entries 1 to 8.
  2. After 5 seconds → Show entries 9 to 16.
  3. After next 5 seconds → Show 17 to 24.
  4. After next 5 seconds → Show 25 to 30.
  5. Then repeat from the beginning.

Would you have any idea how I can do that? Could it possibly realized on the routing function with transfer of the required parameters to the URL?

1 个答案:

答案 0 :(得分:1)

我已经制作了一个Plunker来演示如何实现这一目标:Plunker Demo

简而言之,您可以利用ManagedObject#bindAggregation方法的startIndexlength参数。更具体地说,您可以使用它们重复绑定表。

  this.byId("list").bindItems({
    path: "/Meetups",
    template: this.byId("template"),
    templateShareable: true,
    startIndex: start,
    length: SLICE_SIZE
  });

因为您不断重新绑定表,所以您只需在{...}}的XML视图中创建模板对象,然后就可以通过dependent访问它了。我们需要使用this.byId(...)标志来指示模板将在进一步的绑定中重复使用(在下一个标记中)。

templateShareable

关于路由,我做了两个路由:一个路由("默认")路由和一个指定起始索引的路由(" withStart")。他们俩都指向同一个观点。

<dependents>
  <StandardListItem id="template" title="{Title}" 
    description="{Description}" counter="{MeetupID}" />
</dependents>

&#34;切片之间的过渡&#34;在jQuery.sap.delayedCall的帮助下完成。您也可以使用IntervalTrigger,但如果视图不是第一个显示的话,它可能会导致一些问题(因为第一个&#34;切片&#34;可能不会显示整整5秒,具体取决于当然你如何实现它。)

  "routes": [{
    "pattern": "",
    "name": "default",
    "target": "main"
  }, {
    "pattern": "/{start}",
    "name": "withStart",
    "target": "main"
  }]

然后发生勾号(即当我们需要更改&#34;切片&#34;)时,我们只需导航到jQuery.sap.delayedCall(INTERVAL, this, this.onTick, [start]); 路径并递增withStart索引参数。此时,我们还可以检查是否需要再次从零开始(如果起始索引大于总计数)。

start

为了找出总计数(以确定是否应该归零),您可以使用列表/表ListBinding中的信息。

  start += SLICE_SIZE;
  if (this.count && start >= this.count) {
    start = 0;
  }
  this.getOwnerComponent().getRouter().navTo("withStart", {start: start});

您可能在多视图应用程序中遇到的一个问题是,如果用户在您的&#34;仪表板之间导航&#34;查看和其他一些视图, var oBinding = this.byId("list").getBinding("items"); if (oBinding.isLengthFinal()) { this.count = oBinding.getLength(); } 可能会导致您再次导航回&#34;信息中心&#34;视图(即用户可能会在仪表板中获得&#34;陷阱&#34;)。为避免这种情况,您可以在进行delayedCall调用之前检查视图是否可见。

稍后编辑:

为了提高加载时间的性能,您可以使用两种不同的方法:

  1. 进行绑定时使用operation mode参数。将其设置为navTo将在客户端一次加载所有条目,并且分页机制将在没有进一步请求的情况下完成(至少在理论上)。
  2. Client
    1. 使用ODataModel.read方法初始加载数据,将结果存储到JSON模型中,然后使用JSON模型绑定列表而不是OData模型。
    2.   this.byId("list").bindItems({
          path: "/Meetups",
          template: this.byId("template"),
          templateShareable: true,
          startIndex: start,
          length: SLICE_SIZE,
          operationMode: OperationMode.Client
        });