2015-11-24 4 views
2

Здравствуйте, я пытаюсь связать агрегацию с элементом управления Table, но результирующие строки повторяются с последним результатом в наборе данных. Чтобы уточнить, таблица содержит правильное количество строк и столбцов, но каждая строка повторяет одни и те же данные.Связывание агрегирования показывает только последний элемент

Выполнение запроса чтения OData и помещение результатов в модель JSON и привязка этой модели к таблице работает, но это кажется излишне дорогостоящим.

Связывающую участок

var filter = new Filter("itemID", sap.ui.model.FilterOperator.EQ, this.item.itemID); 
this._template = this._template ? this._template : sap.ui.xmlfragment("InventoryListItem", this.getView().getController()); 
this.inventoryList.bindAggregation("items", { 
    path: "oDataModel>/InventoryUsages", 
    filters: [filter], 
    template: this._template, 
    parameters: { 
     select: 'inventoryID,memberID,fName,lName,condition,purchasedAt,price' 
    } 
}); 

Шаблон:

<core:FragmentDefinition 
xmlns="sap.m" 
xmlns:core="sap.ui.core" 
xmlns:l="sap.ui.layout"> 
<ColumnListItem> 
    <cells> 
     <Text text="{path: 'oDataModel>inventoryID'}" /> 
     <Text text="{parts:[{path:'oDataModel>fName'}, {path:'oDataModel>lName'}], formatter:'.nameFormater'} " /> 
     <Text text="{oDataModel>purchasedAt}" /> 
     <RatingIndicator maxValue="5" class="sapUiSmallMarginBottom" value="{ 
      path: 'oDataModel>condition', formatter: '.conditionFormat'}" 
      change="onRatingPress"/> 
     <Text text="{path:'oDataModel>price', formatter: '.priceFormatter'}" /> 
     <Button text="Remove" 
      icon="sap-icon://delete" 
      press="onRowDelete" 
      class="appBtn"/> 
    </cells> 
</ColumnListItem> 

В таблице отображается правильное число строк и столбцов, но данные не так. Он отобразит последний результат в наборе для каждой строки. Когда таблица будет расти, таблица отобразит следующий результат в наборе. Кто-нибудь знает, как я могу это исправить?

Ответ: Оказывается, я делал вызов OData в представлении, у которого не было первичного ключа. В результате рендеринг вырывается и отображает последний результат по какой-либо причине.

ответ

3

Ну я понял ответ на свой вопрос, то получается, потому что я делаю в OData вызов тем, что не имеет первичный ключ.Если у него нет первичного ключа, он выйдет из строя и отобразит последний результат набора данных. (Если вы используете ASP.NET web api, вы можете просто поместить аннотацию [key] в модель для решения этой проблемы).

0

Я подозреваю, что экземпляр фрагмента один раз (!), Поскольку шаблон может разрушить хаос здесь; поскольку он создается один раз, вы продолжаете использовать ссылку на те же элементы управления, которые в конечном итоге будут отображать последний элемент в вашей модели.

Лучше использовать функцию и возвращает новый экземпляр элемента управления ColumnListItem


EDIT

Я представил рабочий образец ниже (нажмите кнопку «Выполнить фрагмент кода», чтобы увидеть его работы) ,

Поскольку использование фрагмента в качестве шаблона агрегации показалось мне немного по-моему, вот как бы я сделал привязку.

Некоторые моменты:

  1. стола Columns и ColumnListItems определяются как совокупность, непосредственно в окне просмотра. Нет необходимости в отдельном шаблоне, фрагменте или заводской функции, все в представлении (где это должно быть;)
  2. Фильтр принимает число от 1 до 10 и применяется при изменении поля Input.
  3. Самого фильтр только простая функция, которая затем повторно при необходимости

Надеется, что это помогает!

sap.ui.controller("view.initial", { 
 
    
 
    onInit: function() { 
 
     var model = new sap.ui.model.json.JSONModel(); 
 
     model.setData({ 
 
      filterValue : 4, 
 
      someArray : [{"itemID":4,"inventoryID":323,"memberID":440,"fName":"Victoria","lName":"Hutchings","condition":4,"purchasedAt":"1992-01-18T21:53:09.291Z","price":96},{"itemID":1,"inventoryID":83,"memberID":83,"fName":"Connie","lName":"Monuteaux","condition":4,"purchasedAt":"2001-07-28T01:05:35.935Z","price":99},{"itemID":3,"inventoryID":591,"memberID":399,"fName":"Cecelia","lName":"Peschke","condition":1,"purchasedAt":"2063-07-03T22:41:15.159Z","price":17},{"itemID":8,"inventoryID":523,"memberID":417,"fName":"Ginger","lName":"Vasquez","condition":5,"purchasedAt":"1967-02-27T09:24:18.631Z","price":67},{"itemID":6,"inventoryID":310,"memberID":573,"fName":"George","lName":"Dixon","condition":4,"purchasedAt":"2050-05-04T12:46:00.850Z","price":6},{"itemID":2,"inventoryID":749,"memberID":887,"fName":"Subha","lName":"Gunn","condition":3,"purchasedAt":"1952-04-08T01:51:08.544Z","price":40},{"itemID":7,"inventoryID":46,"memberID":546,"fName":"Delena","lName":"Ramirez","condition":4,"purchasedAt":"2051-04-05T07:03:10.635Z","price":62},{"itemID":0,"inventoryID":734,"memberID":775,"fName":"Bola","lName":"Shah","condition":4,"purchasedAt":"1986-09-17T23:29:15.318Z","price":97},{"itemID":8,"inventoryID":550,"memberID":546,"fName":"Kassaundra","lName":"Cowen","condition":4,"purchasedAt":"1954-11-25T09:37:03.604Z","price":83},{"itemID":9,"inventoryID":469,"memberID":692,"fName":"April","lName":"Garcia","condition":2,"purchasedAt":"1909-07-07T21:40:21.919Z","price":1},{"itemID":0,"inventoryID":777,"memberID":88,"fName":"Suzanne","lName":"Foxen","condition":5,"purchasedAt":"2026-04-04T13:18:20.715Z","price":21},{"itemID":5,"inventoryID":401,"memberID":956,"fName":"Angelo","lName":"Spellicy","condition":2,"purchasedAt":"2044-10-13T19:17:29.321Z","price":51},{"itemID":10,"inventoryID":799,"memberID":216,"fName":"Sonny","lName":"Gergely","condition":3,"purchasedAt":"1947-01-07T01:12:29.721Z","price":33},{"itemID":4,"inventoryID":175,"memberID":552,"fName":"Sara","lName":"Trautman","condition":0,"purchasedAt":"1992-08-17T22:24:36.123Z","price":52},{"itemID":6,"inventoryID":488,"memberID":580,"fName":"Penny","lName":"Bettencourt","condition":4,"purchasedAt":"1915-04-25T05:17:05.226Z","price":52},{"itemID":7,"inventoryID":713,"memberID":812,"fName":"Greg","lName":"Mulvehill","condition":0,"purchasedAt":"1970-05-03T22:47:42.502Z","price":50},{"itemID":1,"inventoryID":978,"memberID":401,"fName":"Kathe","lName":"Krugel","condition":0,"purchasedAt":"1942-02-09T21:40:24.584Z","price":96},{"itemID":2,"inventoryID":686,"memberID":216,"fName":"Jody","lName":"Gage","condition":5,"purchasedAt":"2010-11-25T16:43:41.214Z","price":86},{"itemID":4,"inventoryID":686,"memberID":110,"fName":"Shelly","lName":"Knoepfel","condition":1,"purchasedAt":"1989-06-29T04:58:29.195Z","price":37},{"itemID":4,"inventoryID":977,"memberID":350,"fName":"LaDagea","lName":"Doerfler","condition":1,"purchasedAt":"1959-03-18T15:10:34.816Z","price":2}] 
 
     }); 
 
     sap.ui.getCore().setModel(model); 
 
    }, 
 

 
    onAfterRendering: function() { 
 
     this.applyFilter(); 
 
    }, 
 

 
    applyFilter: function() { 
 
     var allFilter=[]; 
 
     allFilter.push(new sap.ui.model.Filter("itemID", sap.ui.model.FilterOperator.EQ, this.getView().getModel().getProperty("/filterValue"))); 
 

 
     var oTable = this.getView().byId("myTable"); 
 
     var oBinding = oTable.getBinding("items"); 
 
     oBinding.filter(allFilter, sap.ui.model.FilterType.Application); 
 
    } 
 
}); 
 

 
var oView = sap.ui.xmlview({ 
 
    viewContent: jQuery("#view1").html() 
 
}) 
 

 
oView.placeAt("uiArea");
<script id="sap-ui-bootstrap" 
 
    src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js" 
 
    data-sap-ui-theme="sap_bluecrystal" 
 
    data-sap-ui-xx-bindingSyntax="complex" 
 
    data-sap-ui-libs="sap.m"></script> 
 

 
<div id="uiArea"></div> 
 

 
<script id="view1" type="ui5/xmlview"> 
 
    <core:View 
 
     xmlns:core="sap.ui.core" 
 
     xmlns:mvc="sap.ui.core.mvc" 
 
     xmlns="sap.m" 
 
     controllerName="view.initial" 
 
     xmlns:html="http://www.w3.org/1999/xhtml"> 
 
     <Input value="{/filterValue}" change="applyFilter" /> 
 
     <Table id="myTable" items="{/someArray}"> 
 
      <columns> 
 
       <Column> 
 
        <Label text="inventoryID" /> 
 
       </Column> 
 
       <Column> 
 
        <Label text="memberID" /> 
 
       </Column> 
 
       <Column> 
 
        <Label text="fName" /> 
 
       </Column> 
 
       <Column> 
 
        <Label text="lName" /> 
 
       </Column> 
 
       <Column> 
 
        <Label text="condition" /> 
 
       </Column> 
 
       <Column> 
 
        <Label text="purchasedAt" /> 
 
       </Column> 
 
       <Column> 
 
        <Label text="price" /> 
 
       </Column> 
 
      </columns> 
 
      <items> 
 
       <ColumnListItem> 
 
        <cells> 
 
         <Text text="{inventoryID}" /> 
 
         <Text text="{memberID}" /> 
 
         <Text text="{fName}" /> 
 
         <Text text="{lName}" /> 
 
         <RatingIndicator maxValue="5" value="{condition}" /> 
 
         <Text text="{purchasedAt}" /> 
 
         <Text text="{price}" /> 
 
        </cells> 
 
       </ColumnListItem> 
 
      </items> 
 
     </Table> 
 
    </core:View> 
 
</script>

+0

Такая же проблема возникает после замены шаблона на заводскую функцию: 'tableRowFactory: function() { var row = new sap.m.ColumnListItem(); row.addCell (новый sap.m.Text ({ текст: "{oDataModel> inventoryID}" })); возвратная строка; } –

+0

Также, глядя на исходный код функции шаблона, он клонирует данный шаблон для каждой строки, но похоже, что моя ошибка исходит из того, что синтаксис привязки неправильный. Я просто не знаю, как это исправить. –

+0

См. Мой обновленный ответ для рабочего решения и некоторые указатели, как продолжить. – Qualiture

0

Если у него нет первичного ключа, он сработает и отобразит последний результат набора данных.

Смежные вопросы