使用 c:forEach 动态设置 h:selectOneMenu 的值
Dynamically setting value of a h:selectOneMenu using c:forEach
我正在做一个项目,需要uires 显示并能够select 并将标签存储到产品中。标签以树状结构提供。我不能假设标签树的最大深度。
我想显示按级别拆分的标签,使用 c:forEach - p:selectManyCheckbox - f:selectItems,并使用 p:ajax 组件处理 select 离子。
我使用以下类型在 Tree 对象中存储可能的值和 selection:
HashMap<Long, ArrayList<Tag>> tree;
HashMap<Long, Object[]> selected;
Hashmap 键等于 "tag level"。
为了显示值,我使用以下代码进行测试:
<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>
代码似乎运行良好,尽管显示了五次。
现在我无法尝试将 Hashmap 动态绑定到 selectors。当我用 "idx" 替换“1”时,我没有得到任何结果。
我尝试使用 ui-repeat 和一个虚拟 table,但后来我失去了 panelgrid 结构。
任何帮助将不胜感激!
我的环境 - Websphere 8.5、JSF 2.2、Primefaces 5.2
<c:forEach begin end>
只适用于静态迭代,不适用于动态迭代
您最好在 <c:forEach items>
中迭代 #{product.tags.tree}
本身。 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
吗?
我正在做一个项目,需要uires 显示并能够select 并将标签存储到产品中。标签以树状结构提供。我不能假设标签树的最大深度。
我想显示按级别拆分的标签,使用 c:forEach - p:selectManyCheckbox - f:selectItems,并使用 p:ajax 组件处理 select 离子。
我使用以下类型在 Tree 对象中存储可能的值和 selection:
HashMap<Long, ArrayList<Tag>> tree;
HashMap<Long, Object[]> selected;
Hashmap 键等于 "tag level"。
为了显示值,我使用以下代码进行测试:
<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>
代码似乎运行良好,尽管显示了五次。
现在我无法尝试将 Hashmap 动态绑定到 selectors。当我用 "idx" 替换“1”时,我没有得到任何结果。
我尝试使用 ui-repeat 和一个虚拟 table,但后来我失去了 panelgrid 结构。
任何帮助将不胜感激!
我的环境 - Websphere 8.5、JSF 2.2、Primefaces 5.2
<c:forEach begin end>
只适用于静态迭代,不适用于动态迭代
您最好在 <c:forEach items>
中迭代 #{product.tags.tree}
本身。 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
吗?