selectonemenu的动态数量

时间:2015-10-25 16:42:29

标签: jsf jsf-2.2

我有两段代码,一段是有效的,另一块则没有。我正在访问不同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)

1 个答案:

答案 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)的阴影名称是一个非常糟糕的主意。