如何在XML视图中绑定扩展集合中的OData $ count

问题描述 投票:13回答:3

可能这是一个基本问题,但我在XML视图中绑定OData计数时遇到问题。

在以下示例中,我想绑定OData模型中的产品计数。

<List items="{/Categories}"} >  
  <ObjectListItem
    title="{CategoryName}"
    number="{path : 'Products/$count'}"
    numberUnit="Products"/>
</List>

每个类别都需要显示相应类别中的产品数量

/Categories(1)/Products/$count
/Categories(2)/Products/$count
sapui5
3个回答
7
投票

我不认为它目前可能 - $ 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>

11
投票

我有一个类似的问题。虽然我对我的解决方案并不感到兴奋,但它使用表达式绑定并且无需单独的格式化程序即可运行:

<List items="{/Categories}"} >  
  <ObjectListItem 
    title="{CategoryName}"
    number="{= ${Products}.length }"
    numberUnit="Products" />
</List>

就像@Jasper_07一样,你仍然需要在扩展中包含Products,但你忽略了大部分数据。


3
投票

嗯..我有完全相同的要求,并且不想从@jasper执行聪明的解决方案,因为它将从oData服务加载所有Products集合。

这就是我解决它的方式:

View

  1. 使用控制器
  2. 为您的列表提供ID
  3. 在列表的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>

Controller

  1. 实现countProducts功能
  2. 使用jQuery为每个列表项请求$ count - 注意如何生成URL连接模型的服务URL与项的绑定上下文
  3. 由于jQuery使用异步请求,当您获得第一个响应时,您的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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.