Hi,

<h:form>
        <h:panelGroup>
                <h:inputText id="testId" 
                rendered="#{component.id eq 'testId'}"                          
        value="#{bean.value}" />
        </h:panelGroup>
</h:form>

please notice the expression:

rendered="#{component.id eq 'testId'}" 

that is clearly true.

But that does not work as expected: inputText is rendered, but never
updates model value.


Problem 1.

from specification, methods UIComponent.process* and encode*
1) If the rendered property of this {@link UIComponent}
false, skip further processing 
2) Call {@link #pushComponentToEL}

-> #{component} resolves in rendered="#{}" to parent!


Problem 2.

MyFaces implement that (pointless) requirement inconsistently: from
UIComponentBase.process*:

(!isRendered())
  return;
pushComponentToEL(context, this)

and from UIComponentBase.encodeBegin*
 pushComponentToEL(context, this);
 if (isRendered())


causes that example above renderes inputText, but never updates model.

Problem 3.

RendererUtils.renderChild(FacesContext, UIComponent): 
in this method it is unappropriate to use following code:

if (!child.isRendered()) {
            return;
        }
child.encodeBegin(facesContext);

because:
1) it does not take into account pushComponentToEL ( #{component}
resolves to parent)
2) behaviour is incosistent with UIComponent.encodeBegin : you'll get
"random" rendering - depends if parent of component renders it's
children or not! For this case I've created MYFACES-3126, but I'll
reopen it now, because simple remove of 'if (!child.isRendered())' does
not solve that problem and causes another problem if component
getRendersChildren = false;


What do yout think about this problem?


Regards,

Kočičák


Reply via email to