Ben
Ben

Reputation: 10288

Trying to render a h:panelGroup outside ui:repeat with complicated structure

This is the general structure of the jsf page:

<ui:repeat id="repeater" varStatus="stat" >
  <h:form id="the-form">
    <h:panelGroup id="renderme">
      <ui:repeat id="inner-repeater">
         <h:commandButton>
           <f:ajax render=":repeater:#{stat.index}:the-form:renderme">
         </h:commandButton>
      </ui:repeat>
    </h:panelGroup>
  </h:form>
</ui:repeat>

So.. the button here, when clicked, should cause the element renderme to be re-rendered.

In practice, I get "component with id ... not found" although when I look at the html page, the generated id is correct.

Moreover, I tried to use #{component.parent.parent.clientId} which produced the same id and still got the same error message from JSF.

Any idea on why this is failing?

Thanks!

Upvotes: 1

Views: 1132

Answers (1)

BalusC
BalusC

Reputation: 1108722

This doesn't work for the simple reason because viewRoot.findComponent("repeater:0:the-form:renderme") as requested by <f:ajax render> doesn't return anything. Such a component does not exist in the component tree. This ID only exists in the generated HTML output. Instead, it's viewRoot.findComponent("repeater:the-form:renderme") which would return something, but this does in turn not exist in HTML DOM tree where JavaScript needs to do the update based on ajax response. Even then, this is not exactly what you need.

This is where JSTL can come to rescue. It's capable of dynamically building the JSF component tree and of dynamically assigning IDs to components generated in a loop:

<c:forEach ... varStatus="stat">
  <h:form id="the-form_#{stat.index}">
    <h:panelGroup id="renderme">
      <ui:repeat id="inner-repeater" ...>
         <h:commandButton ...>
           <f:ajax render=":the-form_#{stat.index}:renderme">
         </h:commandButton>
      </ui:repeat>
    </h:panelGroup>
  </h:form>
</c:forEach>

This will only cause problems when you bind <c:forEach> value to a view scoped bean and you use Mojarra version older than 2.1.18. You'd need to upgrade to at least Mojarra 2.1.18 then.

See also:

Upvotes: 2

Related Questions