The problem with using rendered in this way is that Facelets still builds the 
component tree for elements that are not rendered, but your component tree is 
broken (because the binding you refer to doesn't exist).  

This is one of those cases where you actualy need to modify the component tree 
based on your condition(instead of turning components on and off) so you'll 
probably need to use c:forEach and c:if

-----Original Message-----
From: Venkat Rao [mailto:[EMAIL PROTECTED]
Sent: Mon 31-Jul-06 11:42 AM
To: 'MyFaces Discussion'
Subject: "rendered" condition does not work as expected
 
My code inside a "rendered" flag is getting invoked even when the condition
is false. I am iterating over a list of Graphics objects to display
information about each by calling the object specific methods. The code
works fine if I use only <h:outputText>. If I use <h:inputText> however, the
rendered property does not seem to be taking effect.

<ui:repeat var="graphicsObj" value="#{gfx.graphicsObjList}">

    <h:panelGroup rendered="#{graphicsObj.objType == 'circle'}" >
        [Circle] Radius: <h:outputText value="#{graphicsObj.radius}"/>
    </h:panelGroup>

    <h:panelGroup rendered="#{graphicsObj.objType == 'rectangle'}" >
        [Rectangle] Length: <h:outputText value="#{graphicsObj.length}"/>
    </h:panelGroup>

</ui:repeat>

The above works fine, as expected. However, if I change from <h:outputText>
to <h:inputText>, it complains :

javax.faces.el.PropertyNotFoundException: /graphics.xhtml @24,54
value="#{graphicsObj.radius}": Bean: Rectangle, property: radius

So, the first block of code is getting executed for a Rectangle object when
using a <h:inputText> but not when using <h:outputText>. 

Any help in solving the problem is appreciated. The code for the Circle and
Rectangle beans is given below:

public class Circle implements Serializable
{
    public String getObjType() {
        return "circle";
    }

    int radius;
    public void setRadius(int radius) {
        this.radius = radius;
    }
    public int getRadius() {
        return this.radius;
    }
}

public class Rectangle implements Serializable
{
    public String getObjType() {
        return "rectangle";
    }

    private int length;
    public void setLength(int length) {
        this.length = length;
    }
    public int getLength() {
        return this.length;
    }
}


<<winmail.dat>>

Reply via email to