2014-05-22 9 views
10

Może to być podstawowe pytanie, ale mam problem z powiązaniem liczby Odata w widoku XML.

Powiedzmy w poniższym przykładzie, że chcę powiązać liczbę produktów z modelu Odata.

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

Każda kategoria potrzebuje, aby wyświetlić liczbę produktów w danej kategorii ..... jak w

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

Dzięki za pomoc z góry.

Odpowiedz

7

nie sądzę jego aktualnie możliwe - count $ jest opcją zapytania OData, odpowiednik w ODataListBinding jest długość, np Products.length nie mogę wymyślić sposób, aby powiązać go

można osiągnąć liczbę Za kilka sposobów, z wykorzystaniem formatowania

opcja 1 - najprostsza, utworzyć listę wiążącego, który brzmi całkowitą liczbę produktów, robi synchronicznego połączenia i zwraca

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> 

opcję tylko hrabia $ 2 - użyj poszerzyć i powrócić bardzo mały zbiór danych, w tym przypadku tylko CategoryName i ProductID, zastrzeżenie o to, czy trzeba przez stół wprost stronicowania, aby uzyskać pełną listę

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

Cóż .. Miałem dokładnie to samo wymaganie i nie chciałem wykonać rozwiązania cleaver z @jasper, ponieważ załaduje on całą kolekcję Produktów z usługi oData.

To było tak, jak go rozwiązać:

Zobacz

  1. użyć kontrolera
  2. Daj lista id
  3. użyć funkcji na liście za updateFinished imprezy.
<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> 

Controller

Wewnątrz kontrolera:

  1. Implement funkcja "countProducts"
  2. użyć jQuery do żądania $ licznik dla każdego elementu listy - Zauważ, jak adres URL jest generowany, łącząc URL usługi modelu z kontem powiązania elementu xt
  3. Jako że jQuery używa asynchronicznych żądań, do czasu otrzymania pierwszej odpowiedzi prawdopodobnie twoja wiadomość zostanie zakończona.Więc może korzystać clojures aby uniknąć wypełniania tylko ostatni element listy z ajax odpowiedzi
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

To było najlepsze rozwiązanie, zdecydowanie docenione! –

+0

Dzięki @ChrisR - Jeśli to możliwe, rozważ także dodanie nowej usługi do usługi zaplecza i zaimplementuj tam również liczbę. Wtedy skorzystasz z prostego powiązania w kodzie UI5. – fabiopagoti

9

miałem podobny problem. Choć nie jestem zachwycony moim rozwiązanie, używa wyrażenia wiązania i działa bez potrzeby oddzielnego formater:

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

Jak @ Jasper_07, trzeba jeszcze to Products W rozwijać, ale ignorują większość dane wracają.

+0

Ta odpowiedź powinna zostać zaakceptowana od czasu wprowadzenia wiązań do wyrażenia. @ c_y –

Powiązane problemy