How to re-render <ui:repeat> using <f:ajax render>
Asked Answered
H

4

11

I have implemented a list created by a repeater:

<ui:repeat value="#{projectData.paginator.list}" var="project">
  <h:outputText value="#{project.title}" />
</ui:repeat>

and a Button that filters my list:

<h:commandLink action="#{overviewController.filterNew}">
<h:outputText value="Filter List" />
</h:commandLink>

So, is there an easy way to render only my repeater after clicking the command link (with AJAX) :-)


I tried following:

<f:ajax render="repeater">
ui:repeat id="repeater" value="#{projectData.paginator.list}" var="project">
  <h:outputText value="#{project.title}" />
</ui:repeat>
<f:ajax />


<h:commandLink action="#{overviewController.filterNew}">
<h:outputText value="Filter List" />
<f:ajax event="click" render="repeater"/>
</h:commandLink>

but that did not work..


Update

<h:form>
ui:repeat id="repeater" value="#{projectData.paginator.list}" var="project">
  <h:outputText value="#{project.title}" />
</ui:repeat>

<h:commandLink action="#{overviewController.filterNew}">
<h:outputText value="Filter List" />
<f:ajax event="click" render="repeater"/>
</h:commandLink>
</h:form>

doesn't work either... Maybe I hav to put the action method (overviewController.filterNew) into the ajax tag?


Update 2

    <f:ajax event="click" render="repeater">
    <h:commandLink action="#{overviewController.filterEBus}">
    <h:outputText value="EBusiness" />
    </h:commandLink>
    </f:ajax>

Doesn't work either!


Maybe it's not possible to rerender a repeater ? is there another element like a div tag or something that can be rerendered???

...

Thank you for your help

Hajji answered 23/8, 2010 at 12:41 Comment(2)
Maybe I hav to put the action method (overviewController.filterNew) into the ajax tag? - try, why not?Underwent
Doesn't work either! If nobody sees a mistake maybe there is a jsf/ajax bug?Hajji
O
27

The <ui:repeat> itself does not generate any HTML to the output. The <f:ajax render> expects an ID which is present in the HTML DOM tree. Put it in a <h:panelGroup> with an id and reference it instead.

<h:form>
    <h:panelGroup id="projects">
        <ui:repeat value="#{projectData.paginator.list}" var="project">
            <h:outputText value="#{project.title}" />
        </ui:repeat>
    </h:panelGroup>
    <h:commandLink action="#{overviewController.filterNew}">
        <h:outputText value="Filter List" />
        <f:ajax execute="@form" render="projects" />
    </h:commandLink>
</h:form>
Oversupply answered 24/8, 2010 at 11:21 Comment(1)
But for me it seems that this does not work in case of a validation exception. In this case my data is lost.Sulphurous
T
4

Yes:

Travancore answered 23/8, 2010 at 12:48 Comment(0)
U
2
<f:ajax render="repeater">
ui:repeat id="repeater" value="#{projectData.paginator.list}" var="project">
  <h:outputText value="#{project.title}" />
</ui:repeat>
<f:ajax />

why did you wrap it with f:ajax? It's redundant in this case.

Make sure that your components are surrounded by <h:form> tag

<h:form>
<ui:repeat id="repeater" value="#{projectData.paginator.list}" var="project">
  <h:outputText value="#{project.title}" />
</ui:repeat>

<h:commandLink action="#{overviewController.filterNew}">
<h:outputText value="Filter List" />
<f:ajax event="click" render="repeater"/>
</h:commandLink>
</h:form>
Underwent answered 23/8, 2010 at 15:23 Comment(1)
That's what I tried as well. And I surrounded the whole part with h:form tags :-( It just dies nothing -.-Hajji
E
0

How about this:

<ui:repeat id="repeater" value="#{projectData.paginator.list}" var="project">
  <h:outputText value="#{project.title}" />
</ui:repeat>

<h:commandLink>
  <h:outputText value="Filter List" />
  <f:ajax render="repeater" listener="#{overviewController.filterNew}" />
</h:commandLink>
Endor answered 24/8, 2010 at 11:31 Comment(2)
ui:repeat doesn't support the id attribute. Which makes sense since it doesn't represent anything, it's just a flow control tag.Oversupply
Ok, so he'll need to wrap it in <h:panelGroup>Endor

© 2022 - 2024 — McMap. All rights reserved.