我有一个要求,我需要将列表项的数量实时更新到页面的子标题。我想使用
sap.ui.base.EventProvider
、聚合绑定或表达式绑定。请指导我,因为我以前从未使用过它。
如果我删除列表项,列表项的数量应该实时更新。
如果使用JSONModel
这样的
客户端模型(即假设所有数据在客户端上都可用)并且目标集合是数组,则简单的表达式绑定就足够了:
title="{= ${myJSONModel>/myProducts}.length}"
sap.m.Table
sap.ui.table.Table
正如您在上面的示例中看到的,当项目数量发生变化时,框架会通知Expression Binding,它最终会自动更新属性值。
updateFinished
api 的 sap.m.ListBase
特别是如果启用了增长功能,此事件会派上用场,始终获取框架分配给事件参数的新计数值
total
。
[参数
]可以在total
属性设置为growing
时使用。true
sap.m.ListBase
<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
的值..
change
api 的 sap.ui.model.Binding
此事件可以应用于 any 绑定,特别是当控件不支持
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
(或
$inlinecount
)。我们可以通过调用 public API getLength()
来获取计数结果。"growing"
中没有包含sap.ui.model.ChangeReason
原因。但如果控件可以增长,它可能是从支持 updateFinished
事件的 ListBase 派生的。
$count
附加到读取方法中的路径:
myV2ODataModel.read("/Products/$count", {
filters: [/*...*/],
success: function(data) {
const count = +data; // "+" parses the string to number.
// ...
}.bind(this),
})
OData V4
<Table id="SalesOrders"
items="{
path : '/SalesOrderList',
parameters : {
$count : true
}
}"
>
<headerToolbar>
<Toolbar>
<content>
<Title id="SalesOrdersTitle" text="{$count} Sales Orders"/>
</content>
</Toolbar>
</headerToolbar>
...
</Table>
更新完成
onUpdateFinished: function(oEvent) {
var sTitle
, oTable = oEvent.getSource()
, iTotalItems = oEvent.getParameter("total");
if (iTotalItems && oTable.getBinding("items").isLengthFinal()) {
sTitle = this.getText("txtTableCount", [iTotalItems]);
} else {
sTitle = this.getText("txtTableCount", [0]);
}
this.getModel("modelApp").setProperty("/titleTable", sTitle);
},
https://openui5.hana.ondemand.com/topic/77d2310b637b490495d78b393ed6aa64
[
{objectName: "object1"},
{objectName: "object2"},
{objectName: "object3"}
]
然后尝试:
<Page title="{= ${myListModel>/}.length}">