实时更新项目数

时间:2018-01-17 19:49:20

标签: sapui5

我有一个要求,我需要将列表项的数量更新为Page的子标题。我想使用sap.ui.base.EventProvider,聚合绑定或表达式绑定。请告诉我,因为我以前从未使用过它。

如果我删除了一个列表项,列表项的数量应该是实时更新。

2 个答案:

答案 0 :(得分:1)

客户端模型

当使用客户端模型(如JSONModel)时,一个简单的表达式绑定就足够了:

title="{= ${myModelName>/myProducts}.length}"

示例: https://embed.plnkr.co/NGnnqI/

正如您在上面的示例中所看到的,当更改项目数时,框架会通知expression binding,由于OneWay绑定,它最终会自动更新属性值。

服务器端模型(OData)

在这种情况下,它并不像上面的方法那么简单,因为表达式绑定在这里不适用(参见下面的推理)。但是,我们仍然可以通过以下方法方便地更新项目数量:

OData V2

使用sap.m.ListBase

中的updateFinished事件

特别是如果启用了增长功能,此事件会派上用场,以便始终获得框架分配给事件参数total的新计数值。

  

如果total属性设置为growing,则可以使用[参数true]。

示例https://embed.plnkr.co/pVsUr5/

<List
  growing="true"
  items="{/Products}"
  updateFinished=".onUpdateFinished"
>
onUpdateFinished: function(event) {
  const reason = event.getParameter("reason"); // "Filter", "Sort", "Refresh", "Growing", ..
  const count = event.getParameter("total"); // Do something with this $count value
  // ...
},

在控件更新和处理项绑定后触发updateFinished事件。事件参数"total"提供根据过滤,排序等操作请求的$count值。

使用sap.ui.model.Binding

中的change事件

此事件可应用于任何绑定,这些绑定会派上用场,特别是如果控件不支持updateFinished事件。

someAggregation="{
  path: '/Products',
  events: {
    change: '.onChange'
  }
}"
onChange: function(event) {
  const reason = event.getParameter("reason"); // See: sap.ui.model.ChangeReason
  const count = event.getSource().getLength();
  // ...
},
  • event.getSource()返回对应的(List)Binding对象,其结果为$count(或$inlinecountstored internally。我们可以通过调用public API getLength()来获得该计数结果。
  • 一个缺点是sap.ui.model.ChangeReason中有没有"growing"原因。但是如果控件可以增长,它可能来自ListBase,无论如何支持updateFinished事件。

手动触发

如果根本没有列表绑定,但仍需要计数值,我们总是可以手动发送请求以获取计数值。为此,请将系统查询$count附加到read方法中的路径:

myODataModel.read("/Products/$count", {
  success: function(data) {
    const count = +data; // "+" parses the string to number.
    // ...
  }.bind(this),
}) 

为什么表达式绑定不起作用

  1. ODataModel目前没有提供任何API来将某个实体设置为数组。因此,${myODataModel>/Products}myODataModel.getProperty("/Products")会产生 undefined (除非路径是相对的;例如导航属性,相反,{{ 3}})。
  2. 即使它确实有这样的API,这样的数组的length也不会代表整个实体集的完整大小,而是可以通过$top&amp;部分下载的大小。 $skip /增长功能,不代表集合中的项目总数!
  3. OData V4

    请查看文档主题results in an array

答案 1 :(得分:0)

我猜“MyListModel”是你的模型名称,在里面你有这样的东西:

[
  {objectName: "object1"},
  {objectName: "object2"},
  {objectName: "object3"}
]

然后尝试:

<Page title="{= ${myListModel>/}.length}">