Thanks for the pointer. I am now using <c:forEach> and <c:if> as
suggested
by you, and it works better, but not perfectly.
I do a postback in which the graphics object list is modified (one of
the
elements is deleted). So the component tree gets modified when rendering
after the postback. Now, the display/behavior of the components
rendered is
not correct (missing elements, incorrect bindings etc).
In short, each time my page is rendered, the component tree gets
modified in
a significant way, based on the contents of my graphics list, and
based on
the type of the object in the list. Using <c:forEach> or <ui:repeat>
does
not seem to be cutting it (unless I am doing something wrong)
Is the problem I am having genuine? Is the solution to do a binding of a
UIComponent (like PanelGroup), and (re)create the component tree
underneath
it from my Java code (don't quite like this approach, as the Facelet
xhtml
expression is much more elegant)
Would appreciate any pointers. Thanks,
-- venkat
-----Original Message-----
From: Sloan, Noah M [mailto:[EMAIL PROTECTED]
Sent: Monday, July 31, 2006 10:16 PM
To: MyFaces Discussion
Subject: RE: "rendered" condition does not work as expected
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;
}
}