Recently I stumbled across a problem with the rich:modalPanel component of the JBoss RichFaces component library, which didn’t want to show the data of a backing been.

Let’s assume the following scenario:
You have a DataTable with several rows. Each row contains a “See details…” button. This button will popup a modal panel using rich:componentControl and the panel is populated with data of a backing bean. This backing bean is filled with actual data by clicking our “See details…” button using a4j:actionparam

Expressed in code, this might look like this:

<rich:column>
                        
    <a4j:commandButton value=“See details…” id=“det”>
       
                           
        <rich:componentControl for=“popup”
            operation=“show” event=“onclick”
            disableDefault=“true”/>

           
        <a4j:actionparam name=“id” assignTo=“#{popupBean.dataId}”
            value=“#{rowdata.dataId}”/>

           
       
        <!– some more actionparams … –>     
                               
    </a4j:commandButton>
                                                       
</rich:column>

Well, everything seems fine, doesn’t it? The properties for the bean of the popup are set with a4j:actionparam, the rich:componentControl displays the popup, which then accesses its data.
So let’s test it. Hugh, there is no data in your popup?

There is one thing we missed. The problem is, that the rich:componentControl triggers simple JavaScript code, that is executed before the JSF lifecycle is processed and the bean’s data is set. So your popup is displayed, but at this time, the bean does not have the correct values.

How can we solve this? Well, it’s pretty easy, because we have the reRender attribute on the a4j:commandLink. Simply re-render the fields of your popup, that should hold the actual data. Or embedd them in a a4j:region. This works, because the reRender action is executed after the JSF lifecycle has passed and the values of the bean are now set correctly.

Just one hint at the end: don’t re-render the whole popup, since this way it will be hidden again.

The slightly modified working code:

<rich:column>
                        
    <a4j:commandButton value=“See details…” id=“det”
        reRender=“popup_dataIdField, …”>

       
                           
        <rich:componentControl for=“popup”
            operation=“show” event=“onclick”
            disableDefault=“true”/>

           
        <a4j:actionparam name=“id” assignTo=“#{popupBean.dataId}”
            value=“#{rowdata.dataId}”/>

           
       
        <!– some more actionparams … –>     
                               
    </a4j:commandButton>
                                                       
</rich:column>


Related:
AJAX-Style Progress Panel with RichFaces
Java Server Faces and selectManyCheckbox (UISelectMany)
How to use HTML comments in Facelets
Jazoon 08 (Java Conference in Zurich) - Ajax Push

Are you interested in reading more from CodingClues?
Then subscribe to new postings via RSS or via E-Mail.




Viewing 5 Comments

 
close Reblog this comment
blog comments powered by Disqus