views:

560

answers:

2

HI, I am using nested ui:repeats to display my data. the outer UI:repeat works and binds to bean just fine, but the inner does not bind to the bean. In sumary, I would like to display a list of people where each person has a name and a list of email addresses. Here is my code:

<ui:repeat value="#{myFamily.personList}" var="eachPerson" >
  <tr:panelCaptionGroup captionText="#{eachPerson.name}" styleClass="fullWidth">
    <h:inputText value="#{eachPerson.age}" styleClass="fullWidth" />    
    <ui:repeat value="#{eachPerson.emailList}" var="eachEmail" >
      <h:panelGrid columns="2">
        <h:outputLabel value="#{eachEmail.type}:" styleClass="darkBlue label" />
        <h:inputText value="#{eachEmail.email}" maxlength="40" size="38" />
      </h:panelGrid>
    </ui:repeat>
  </tr:panelCaptionGroup>
</ui:repeat>

The binding to the personList was fine since I had tested by changing the age of each person and the model changed after I submit. However, the emails list is not changed no matter what I change on the screen.

Please help! I am using JSF, Spring Web Flow, Facelets, and Trinidad.

A: 

Ensure that you preinstantiate the emailList property of the Person class. JSF won't do that for you. This applies to all "nested" properties, not only collections, but also javabeans and maps.

Thus, basically instead of

public class Person {
    private List<Email> emailList;
}

you need to have

public class Person {
    private List<Email> emailList = new ArrayList<Email>();
}
BalusC
A: 

Thank you for you quick response. After spending some time on google, I found out that nested UI:repeat is well suported. You can use different alternatives like tr:iterator, c:forEach, and/or tr:forEach.

One thing I'd like to clearify that c:forEach and ui:repeat do bind values to the backing beans and well supported in jsf and facelets.

Nhut Le
Please post comments as comment, not as answer.
BalusC