Rerender A Rendered Czyli Richfaces A Jsf

Wyobraźmy sobie taką stronę.

<a:commandButton action="..." reRender="foo"/>
<!--...-->
<rich:outputPanel id="foo" rendered="#{...}"/>

Ten kod nie działa jeśli panel nie jest na początku zrenderowany. RichFaces po naciśnięciu guzika przerenderowuje panel, i wysyła go na stronę ale po stronie klienta nie wiadomo gdzie go wstawić na stronie. Jeśli jakiś tag ma rendered="false" to jest on całkowicie usuwany ze strony tak że nie ma nawet markera 'tu powinien być panel taki a taki'.

Żeby ta strona działała trzeba komponent mający rendered="false" opakować w <a:outputPanel layout="none" ajaxRendered="true">1 czyli powinno być tak:

<a:commandButton action="..." reRender="foo"/>
<!--...-->
<a:outputPanel layout="none" ajaxRendered="true">
    <rich:outputPanel id="foo" rendered="#{...}"/>
</a:outputPanel>

Output Panel ma dwie funkcje:

  1. Powoduje że jego zawartość jest renderowana ponownie zawsze przy każdym requeście ajaksowym
  2. Jeśli jakieś jego dziecko nie jest renderowane wstawia zamiast niego markera, który umożliwi wstawienie go później.
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License