2016-01-18 5 views
3

В sapUI5 У меня есть JSONModel, содержащийКак получить доступ к индексу итерации в привязке агрегирования sapUI5?

{ 
    "element1": { 
    "columnName": "col1", 
    "values":[ 
     {"name": "value 1 - 1", "selected": true}, 
     {"name": "value 1 - 2", "selected": true}, 
     {"name": "value 1 - 3", "selected": true}, 
     {"name": "value 1 - 4", "selected": true} 
    ] 
    }, 
    "element2": { 
    "columnName": "col2", 
    "values":[ 
     {"name": "value 2 - 1", "selected": true}, 
     {"name": "value 2 - 2", "selected": true}, 
     {"name": "value 2 - 3", "selected": true}, 
     {"name": "value 2 - 4", "selected": true} 
    ] 
    } 
} 

и XML-View, связанный с этой моделью итерации по каждому элементу и каждое значение элементов (для отображения флажка для каждого значения):

<mvc:View 
    ... 
    xmlns:app="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1" 
    xmlns="sap.m" 
> 
    <VBox items="{/}"> 
     <VBox items="{values}"> 
      <CheckBox 
       text={name} 
       app:xxColumName="{/columnName}" <!-- this is null - how to add columnName here? --> 
      ></CheckBox> 
     </VBox> 
    </VBox> 
</mvc:View> 

Как я могу получить доступ к & привязать значение columnName от элемента JSON к каждому флажку?

Есть ли такой синтаксис, как {/$idex/columnName}, чтобы я мог «вырваться» из пространства имен 2-го цикла?

Edit: JS-Bin is here.

+0

Ваша внешняя структура JSON не является массивом, а объект (вот почему это завернутые в '' {}, а не '[]'). Вы уверены, что повторяете что-нибудь? – Marc

+0

Yepp. Вы можете перебрать оба: массивы и объекты – Benvorth

+0

Было бы здорово, если бы вы могли создать пример JSBin. – Marc

ответ

1

Одной из проблем является то, что items агрегированной вы вводите во внутренней VBox накладывает контекст на относительные привязки в шаблоне.

Не обращаясь непосредственно к конкретному вопросу (я не думаю, что существует такое мнение, как ссылка $index), я бы предположил, что, поскольку это набор данных, основанный на JSONModel, вы можете использовать подход, данных в соответствии с вашими требованиями.

Другими словами, почему бы не добавить columnName собственности на каждую карту в массиве values?

Вот пример того, как это может быть сделано:

function addProp(p, v) { return function(m) { m[p] = v; return m; }; } 
var mData = oModel.getData(); 
for (var e in mData) { 
    mData[e].values = mData[e].values.map(addProp('columnName', mData[e].columnName)); 
} 
oModel.setData(mData); 

Добавить это как раз перед этой частью:

myView.setModel(oModel); 
myView.placeAt('content'); 

И вы сделали.

enter image description here

+1

Полезно, спасибо. Я решил свою проблему аналогичным образом. Недостатком является то, что это огромная нагрузка на данные в моей модели. Обратите внимание, что вы можете упростить код в цикле до 'oModel.setProperty ("/"+ e +"/columnName ", mData [e] .columnName);'. Таким образом, вы не должны использовать 'oModel.setData (mData);' после цикла - в случае хранения других данных в модели. – Benvorth

+0

да, вы могли бы. Но я хотел сохранить разметку и настройку отдельно, в основном, чтобы проиллюстрировать подход к изменению данных, вот и все :-) – qmacro