我有两段代码,一段是有效的,另一块则没有。我正在访问不同selectOneMenu
列表中的不同对象。因此,如果我的列表大小为4,那么我有4 selectOneMenu
。在spinner
之上有一个selectOneMenu
来通知我想要多少个varstatus
。
我不明白为什么使用Map
访问列表的第一个工作,而使用var的第二个工作没有。 <p:spinner value="#{matchCreation.numbreOfmaps}" min="1" max="7">
<f:ajax event="change" render="mapsGroup" execute="mapsGroup"/>
</p:spinner>
<!-- maps start -->
<h:panelGroup id="mapsGroup">
<table>
<ui:repeat var="mapPlayed" value="#{matchCreation.playedMaps}" varStatus="status">
<tr><td>
<p:selectOneMenu value="#{matchCreation.playedMaps[status.index]}">
<f:selectItems value="#{matchCreation.mapList}" var="map" itemValue="#{map}" itemLabel="#{map.name}"/>
<f:converter binding="#{mapConverter}"/>
</p:selectOneMenu>
</td></tr>
</ui:repeat>
</table>
</h:panelGroup>
是自定义实体btw。
作品:
<p:spinner value="#{matchCreation.numbreOfmaps}" min="1" max="7">
<f:ajax event="change" render="mapsGroup" execute="mapsGroup"/>
</p:spinner>
<!-- maps start -->
<h:panelGroup id="mapsGroup">
<table>
<ui:repeat var="mapPlayed" value="#{matchCreation.playedMaps}">
<tr><td>
<p:selectOneMenu value="#{mapPlayed}">
<f:selectItems value="#{matchCreation.mapList}" var="map" itemValue="#{map}" itemLabel="#{map.name}"/>
<f:converter binding="#{mapConverter}"/>
</p:selectOneMenu>
</td></tr>
</ui:repeat>
</table>
</h:panelGroup>
不起作用:
mapList.get(0)
在这个列表中,列表将包含指定的地图编号,但它们都将等于private List<Map> mapList; // initiated in post construct.
private List<Map> playedMaps;
private int numbreOfmaps = 1;
public List<Map> getPlayedMaps() {
// I know this is not advised but I didn't really think of another way.
// It's not heavy work anyway.
while (playedMaps.size() > numbreOfmaps) {
playedMaps.remove(playedMaps.size() - 1);
}
while (playedMaps.size() < numbreOfmaps) {
playedMaps.add(mapList.get(0));
}
return playedMaps;
}
。
的java:
(DD/MM/YYYY)
答案 0 :(得分:1)
<ui:repeat var="mapPlayed">
表示范围变量,而不是bean属性。想象“幕后”工作,它看起来像:
for (Map mapPlayed : matchCreation.getPlayedMaps()) {
// ...
System.out.println(mapPlayed);
}
使用<p:selectOneMenu value="#{mapPlayed}">
时,JSF实际上在作用域变量中设置了提交的值,而不是bean属性。在封面下,想象一下:
for (Map mapPlayed : matchCreation.getPlayedMaps()) {
Map newMapPlayed = getSubmittedValueSomehow();
mapPlayed = newMapPlayed;
// ...
}
这不会反映在列表中。
使用循环索引可以更好地工作:
for (int index = 0; index < matchCreation.getPlayedMaps().size(); index++)
Map newMapPlayed = getSubmittedValueSomehow();
matchCreation.getPlayedMaps().set(index, newMapPlayed);
// ...
}
对具体问题 无关,标准Java SE API类(如Map
(来自java.util.Map
)的阴影名称是一个非常糟糕的主意。