I am having an issue using <ui:repeat> in a JSF page. I have an arrayList that I am passing to it, however, it never iterates through to display the contents.
I know that there is content because when I do the exact same thing using a <h:datatable>, it displays the contents. So if someone could explain to me why this does not work using <ui:repeat> but does using <h:datatable>, that would be great.
Here is the <h:datatable> code:
<h:dataTable value="#{proposalAction.proposal.proposalCountries}" var="pc" rendered="#{proposalAction.proposal.proposalCountries !=null and proposalAction.proposal.proposalCountries.size() > 0}">
<h:column>
<img src="/resources/images/flags/#{utils.getValidCountryFlagDisplayCode(pc.country)}.png" title="#{pc.country.getDisplayName(localeSelector.locale)}" alt="#{pc.country.getDisplayName(localeSelector.locale)}" width="20" />
 
<h:outputText value="#{pc.country.getDisplayName(localeSelector.locale)}" />
</h:column>
</h:dataTable>
And here is the code using the <ui:repeat> code:
<ul>
<ui:repeat items="#{proposalAction.proposal.proposalCountries}" var="pc" rendered="#{proposalAction.proposal.proposalCountries !=null and proposalAction.proposal.proposalCountries.size() > 0}">
<li>
<img src="/resources/images/flags/#{utils.getValidCountryFlagDisplayCode(pc.country)}.png" title="#{pc.country.getDisplayName(localeSelector.locale)}" alt="#{pc.country.getDisplayName(localeSelector.locale)}" width="20" />
 <h:outputText value="#{pc.country.getDisplayName(localeSelector.locale)}" />
</li>
</ui:repeat>
</ul>
As you can see, they are identical. The datatable displays the countries, and yet the repeater doesn't display anything within the <ul> ... I am at a loss... please help!
If you have proper getters and setters then try using #{pc.country.displayName} as a value to your h:outputText tag. ui:repeat does not have items attribute, so use value instead. I am assuming displayName is a property of Country of your main list. And you can write your specific Locale logic inside getter.
This should work:
<ul>
<ui:repeat value="#{proposalAction.proposal.proposalCountries}" var="pc" rendered="#{proposalAction.proposal.proposalCountries !=null and proposalAction.proposal.proposalCountries.size() > 0}">
<li>
<h:outputText value="#{pc.country.displayName}" />
</li>
</ui:repeat>
</ul>
Make such adjustments to your img tag too.
You should also put the logic for rendered in backend bean and use single boolean here on UI. such as redered="#{displayCountries}.