2015-12-22 1 views
0

Я работаю над проектом, который требует от меня отображения и возможности выбора и хранения тегов для продукта. Теги представлены в древовидной структуре. Я не могу предположить максимальную глубину дерева тегов.Динамически устанавливаемое значение h: selectOneMenu с использованием c: forEach

Я хотел отображать теги, разделенные уровнями, используя c: forEach - p: selectManyCheckbox - f: selectItems и обработку выборов с использованием компонентов p: ajax.

Я использую следующие типы для хранения возможных значений и выбора в дереве объектов:

HashMap<Long, ArrayList<Tag>> tree; 
HashMap<Long, Object[]> selected; 

ключи HashMap равны «уровень тегов».

Для отображения значений я использую следующий код для тестирования:

<p:panelGrid id="tagDisplay" columns="2"> 
    <c:forEach begin="1" end="5" var="idx"> 
     <p:outputLabel value="#{idx}"></p:outputLabel> 
     <p:selectManyCheckbox value="#{product.tags.selected[1]}"> 
      <f:selectItems value="#{product.tags.tree[1]}" var="tag" itemLabel="#{tag.name}" itemValue="#{tag.id}" /> 
      <p:ajax listener="#{product.selectorListener}" update="tagDisplay" /> 
     </p:selectManyCheckbox> 
    </c:forEach> 
</p:panelGrid> 

код вроде нормально работает, хотя отображается пять раз.

Теперь я застреваю, пытаясь динамически связывать хэш-карты с селекторами. Когда я заменил «1» на «idx», я не получил никаких результатов.

Я попытался использовать ui-repeat с манекеном, но затем я потерял структуру панели.

Любая помощь будет оценена!

Моя среда - Websphere 8,5, JSF 2.2, 5.2 Primefaces

ответ

1

<c:forEach begin end> только для статической итерации, а не для динамической итерации.

Вам лучше перебрать более #{product.tags.tree} в <c:forEach items>. Каждая итерация по Map даст Map.Entry назад, что в свою очередь имеет getKey() и getValue() методов.

<p:panelGrid ...> 
    <c:forEach items="#{product.tags.tree}" var="entry" varStatus="loop"> 
     <p:outputLabel value="#{loop.index}"></p:outputLabel> 
     <p:selectManyCheckbox value="#{product.tags.selected[entry.key]}"> 
      <f:selectItems value="#{entry.value}" ... /> 
      ... 
     </p:selectManyCheckbox> 
    </c:forEach> 
</p:panelGrid> 

Тем не менее, должен ли он быть действительно HashMap? Разве вы не хотите фиксированного заказа LinkedHashMap?

+0

Хм, идея итерации кажется солидной, спасибо! Поэтому я должен использовать LinkedHashMap для сохранения порядка итераций. Правильно ли я понял? – ShirouWrath

+0

Чтобы сохранить порядок вставки. В противном случае заказ в основном зависит от JVM make/version. – BalusC

+0

Oj, я проверю это, спасибо за вашу поддержку, как всегда: D – ShirouWrath