可能这是一个基本问题,但我在XML视图中绑定OData计数时遇到问题。
在以下示例中,我想绑定OData模型中的产品计数。
<List items="{/Categories}"} >
<ObjectListItem
title="{CategoryName}"
number="{path : 'Products/$count'}"
numberUnit="Products"/>
</List>
每个类别都需要显示相应类别中的产品数量
/Categories(1)/Products/$count
/Categories(2)/Products/$count
我不认为它目前可能 - $ count是一个OData查询选项,ODataListBinding中的等价物是长度,例如Products.length我想不出一种绑定它的方法
您可以使用格式化程序以两种方式实现计数
选项1 - 最简单的,创建一个读取产品总数的列表绑定,它执行同步调用并仅返回$ count
function productCount(oValue) {
//return the number of products linked to Category // sync call only to get $count
if (oValue) {
var sPath = this.getBindingContext().getPath() + '/Products';
var oBindings = this.getModel().bindList(sPath);
return oBindings.getLength();
}
};
<List items="{/Categories}"} >
<ObjectListItem
title="{CategoryName}"
number="{path : 'CategoryName',formatter:'productCount'}"
numberUnit="Products"
</ObjectListItem>
</List>
选项2 - 使用展开并返回一小组数据,在这种情况下只有CategoryName和ProductID,这里需要注意的是你是否必须通过表分页来获取完整列表
function productCount(oValue) {
//read the number of products returned
if (oValue) {
return oValue.length;
}
};
<List items="{/Categories,parameters:{expand:'Products', select:'CategoryName,Products/ProductID'}}">
<ObjectListItem
title="{CategoryName}"
number="{path : 'Products',formatter:'productCount'}"
numberUnit="Products"
</ObjectListItem>
</List>
我有一个类似的问题。虽然我对我的解决方案并不感到兴奋,但它使用表达式绑定并且无需单独的格式化程序即可运行:
<List items="{/Categories}"} >
<ObjectListItem
title="{CategoryName}"
number="{= ${Products}.length }"
numberUnit="Products" />
</List>
就像@Jasper_07一样,你仍然需要在扩展中包含Products
,但你忽略了大部分数据。
嗯..我有完全相同的要求,并且不想从@jasper执行聪明的解决方案,因为它将从oData服务加载所有Products集合。
这就是我解决它的方式:
updateFinished
事件中使用函数。<mvc:View
controllerName="view.Root"
xmlns:mvc="sap.ui.core.mvc"
xmlns="sap.m"
>
<List id="list"
headerText="Categories"
items="{/Categories}"
growing="true"
growingThreshold="4"
growingScrollToLoad="true"
updateFinished=".countProducts"
>
<ObjectListItem
title="{description}"
numberUnit="Products"
/>
</List>
</mvc:View>
countProducts
功能for
将完成。因此,它可以使用IIFE来避免使用您的AJAX响应填充最后一个列表项countProducts: function(e){
var m = sap.ui.getCore().getModel();
var items = this.byId("list").getItems();
for (var item_index = 0; item_index < items.length; item_index++) {
var item = items[item_index];
(function(_item) {
$.get(
m.sServiceUrl + _item.getBindingContextPath() + "/Categorias/$count",
function(count) {
_item.setNumber(count);
}
);
})(item);
}
}