2012-06-10 2 views
1

Я хочу запомнить значения из нескольких h: selectOneMenu в c: forEach. Теперь помните только последнее значение из h: selectOneMenu. Я не знаю, сколько h: selectOneMenu появится.h: selectOneMenu in loop

<h:panelGrid 
        id="wynik" 
        columns="2" 
        border="0" 
        cellpadding="2" 
        cellspacing="0" 
        rowClasses="jsfcrud_odd_row,jsfcrud_even_row" 
        rules="all" 
        style="border:solid 1px"> 
        <h:outputText id="ns" value="Numer stanowiska"/> 
        <h:outputText id="kontr" value="Kontroler"/> 
        <c:forEach 
         var="stanowisko" 
         begin="1" 
         end="#{stojakiController.selected.iloscstanowisk}" 
         step="1"> 
         <h:column> 
          <h:outputText value="#{stanowisko}"/> 
         </h:column> 
         <h:column> 
          <h:selectOneMenu 
           id="kontroler_#{stanowisko}" 
           value="#{wyposazenieStojakaController.selected.kontroler}" 
           title="#{bundle.CreateWyposazenieStojakaTitle_kontroler}" 
           required="true" 
           requiredMessage="#{bundle.CreateWyposazenieStojakaRequiredMessage_kontroler}"> 
           <f:selectItems value="#{kontroleryController.itemsAvailableSelectOne}"/> 
          </h:selectOneMenu> 
         </h:column> 
        </c:forEach> 
       </h:panelGrid> 
+0

Не могли бы вы поделиться исходным кодом? –

ответ

4

Это неправильный способ визуализации таблицы на основе коллекции с динамическим размером. Вы привязываете значение каждой строки к одному и тому же свойствам бэкэнда. Это свойство будет перезаписываться каждый раз, когда каждая строка должна установить значение. Вот почему вы получаете только значение последней строки.

Вместо этого вы должны использовать <h:dataTable>, а не <h:panelGrid> с <c:forEach>. Вы должны готовить коллекцию конкретных объектов модели, а не только размер объектов. Например,

public class Item { 

    private String value; 

    // ... 
} 

Тогда в (пост) конструктору основы боб вы должны подготовить столько, сколько необходимо.

public class Bean { 

    private List<Item> items; 

    @PostConstruct 
    public void init() { 
     items = new ArrayList<Item>(); 

     for (int i = 0; i < yourDesiredAmountOfItems; i++) { 
      items.add(new Item()); 
     } 
    } 

    // ... 
} 

А вот простой пример стартового, как вы должны использовать:

<h:dataTable value="#{bean.items}" var="item"> 
    <h:column> 
     <h:selectOneMenu value="#{item.value}"> 
      <f:selectItems value="#{bean.availableValues}" /> 
     </h:selectOneMenu> 
    </h:column> 
</h:dataTable> 

Когда вы отправите форму, JSF будет установить значение каждой строки правильно в каждом отдельном объекте пункт, связанный со строкой ,

Смежные вопросы