2014-05-22 73 views
10

可能這是一個基本問題,但我在綁定XML視圖中的Odata計數時遇到問題。

說,在下面的例子中,我想綁定來自Odata模型的產品數量。

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

每個類別需要在各自的類別中顯示的產品數量.....在

/Categories(1)/Products/$count 
/Categories(2)/Products/$count 

感謝您的幫助提前。

回答

7

我不認爲它目前可能 - $ count是一個OData的查詢選項,在ODataListBinding相當於是長度,例如Products.length我不能想辦法綁定到它

可以達到數在一對夫婦使用格式化方式

選項1 - 最簡單的,創建綁定列表讀取產品的總數,它同步調用和返回只有$計數

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 - 使用擴展,並返回一個非常小的數據集,在這種情況下,只有類別名稱和產品ID,這裏需要說明的是你是否必須由合格表分頁得到完整列表

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> 
3

嗯..我有完全相同的要求並不希望從@jasper執行cleaver解決方案,因爲它會加載oData服務中的所有Products集合。

這是我解決問題的方法:

查看

  1. 使用控制器
  2. 給你的列表中的ID
  3. 使用名錄的updateFinished事件的功能。
<core:View 
    controllerName="view.Root" 
    xmlns:core="sap.ui.core" 
    xmlns:mvc="sap.ui.core.mvc" 
    xmlns="sap.m"> 
    <List 
     id="list" 
     headerText="Categories" 
     items="{/Categories}" 
     growing="true" 
     growingThreshold="4" 
     growingScrollToLoad="true" 
     updateFinished="countProducts"> 
     <items> 
     <ObjectListItem 
      title="{description}" 
      numberUnit="Products"> 
     </ObjectListItem> 
     </items> 
    </List> 
    </core:View> 

控制器

內部控制器:

  1. 貫徹 「countProducts」 功能
  2. 使用jQuery要求每個列表項$計數 - 請注意如何生成的URL會將模型的服務URL與項目的綁定對象進行連接xt
  3. 由於jQuery使用異步請求,當您獲得第一個響應時,您的for可能會完成。因此,它可以使用clojures以避免填滿剛剛過去的列表項與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); 

    } 
+1

這是迄今爲止最好的解決方案,非常感謝! –

+0

謝謝@ChrisR - 如果可能的話,也可以考慮在後端服務中添加一個新的屬性,並在那裏實現計數。然後,您將受益於UI5代碼中的簡單綁定。 – fabiopagoti

9

我有一個類似的問題。雖然我沒有與我的解決方案興奮不已,它使用表達式綁定而不需要單獨的格式化工作:

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

像@ Jasper_07,你仍然需要在展開Products,但你忽略了最數據回來了。

+0

自從引入表達式綁定後,應該接受這個答案。 @c_y –