Question

I have a JSF composite component which renders only some parts based on the attribute cc.attrs.list passed to it. In one of the components I want to update a set of other components based on the attribute. So something like this:

<p:ajax event="dialogReturn" listener="#{cc.listener}" 
update="#{cc.attrs.id2}_input #{cc.attrs.id2}_resultTable"/>

The problem is that the resultTable is not rendered all the time and when the resultTable is not there, I get an exception Cannot find component with expression "id_resultTable", which is not surprising. So my idea was to create a variable which will contain id of the attribute or empty String like this:

<c:if test="#{cc.attrs.list}">
    <ui:param name="updateTable" value="#{cc.attrs.id2}_resultTable"/>
</c:if>
<c:otherwise>
    <ui:param name="updateTable" value=""/>
</c:otherwise>

and then do the ajax update like this:

 <p:ajax event="dialogReturn" listener="#{cc.listener}" 
update="#{cc.attrs.id2}_input #{updateTable}"/>

The problem is, that the #{updateTable} variable is always an empty String(I've tried to put it as a content of outputText) and I have no idea why.

Was it helpful?

Solution

You can just omit the ui:param and do the check directly in the p:ajax:

<p:ajax event="dialogReturn" listener="#{cc.listener}" 
update="#{cc.attrs.id2}_input #{cc.attrs.list ? cc.attrs.id2.concat('_resultTable') : ''}"/>

A problem with the c:if-approach could be, that when you update this section via ajax the condition is not re-checked as JSTL-tags are evaluated at view build time. Have a look at JSTL in JSF2 Facelets... makes sense? for further information.

OTHER TIPS

This is not really a solution, but I've done a workaround for the problem which works. I've added h:panelGroup with id around the table and I'm updating this instead of the table.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top