Bruno,

Your correct in the fact that rendered=false is useless. However, that is not how it's typically used. Typically this will be bound to a backing bean which will allow you to turn the component on/off. You should use a hidden input field and a switcher if you need to keep the value in the form submission. Adam is totally correct in that it will break a bunch of stuff if we all of a sudden just "turned it on" because people have come to expect the current behavior.

Scott

Bruno Grossi wrote:
Adam,

if "rendered" is always false, there are any reason to include the component/tag on my page?

In my example, I have an web wizard, that shows, step-by-step, some fields in my page. I have a tr:tableLayout and the rendered attribute is on <tr:rowLayout>, to show/hide the whole line, according to the actual "line number"...

Thanks,
Bruno

Adam Winer wrote:
No, it's your responsibility to make sure that "rendered"
is the same on postback as it was when the page was
rendered.  It is an explicit rule of JSF that when
rendered is false, *nothing* renders and nothing
happens on postback.  We cannot start rendering
extra fields for everything that doesn't render -
besides being extremely inefficent, it wouldn't help
you at all when a parent component has rendered="false".

The simplest way to do this is to stop using
EL expressions on "rendered".  Instead, just
call setRendered(true/false) on the component
to toggle visibility.  JSF state saving will handle
everything for you.

-- Adam


On 5/4/07, Bruno Grossi <[EMAIL PROTECTED]> wrote:
Hi,

I detected a problem with checkbox/radios with dynamic rendered
attribute, that I don't know if it's a JSF or Trinidad bug:

If I have a checkbox with a
rendered="${requestScope.someBooleanAttribute}", and a button that
simple alter that attribute in request, to not render it again. If, at
first step, the component is rendered and I check it, my target value is setted to true.. But, if I click the button again, the component exists,
and checks if it's value is changed.

For that, we have:

1- wasSubmitted value returns true:
  protected boolean wasSubmitted(
    FacesContext context,
    UIComponent  component)
  {
    FacesBean bean = getFacesBean(component);
    return !getDisabled(bean) && !getReadOnly(context, bean);
  }

2- getSubmittedValue returns FALSE!
  public Object getSubmittedValue(
    FacesContext context,
    UIComponent  component)
  {
    if (super.getSubmittedValue(context, component) == null)
      return Boolean.FALSE;

    return Boolean.TRUE;
  }

3- The value was changed to FALSE...

It occurs to radio and combos too..

The getSubmittedValue is correctly implemented, because if the checkbox
is unmarked the browser don't send the parameter, and
super.getSubmittedValue(context, component) returns null.



My suggestion is, in that cases, render a hidden field that indicates
that the component was rendered, to check it in wasSubmitted...
Something like:

<input type="hidden" name="form:j_id_jsp_1240287335_0i7_rendered"
value="true">

where form:j_id_jsp_1240287335_0i7 is the component's client id. And:


  protected boolean wasSubmitted(
    FacesContext context,
    UIComponent  component)
  {
    if (!wasRendered(context)) {
       return false;
    }
    FacesBean bean = getFacesBean(component);
    return !getDisabled(bean) && !getReadOnly(context, bean);
  }

  protected boolean wasRendered(...) {
    String clientId = component.getClientId(context);
    return context.getExternalContext().

getRequestParameterMap().get(clientId+"_rendered")!=null;

  }



There are other solution?


Thanks,
Bruno E. Grossi





Reply via email to