On 2/13/07, Hermod Opstvedt <[EMAIL PROTECTED]> wrote:
Hi

I'm struggling with a component that I have defined:

       <component jsfid="navnpanel" extends="clay" id="navnpanel">
               <element jsfid="t:htmlTag" renderId="1">
                       <attributes>
                               <set name="value" value="fieldset" />
                       </attributes>
                       <element jsfid="t:htmlTag" renderId="2">
                               <attributes>
                                       <set name="value" value="legend" />
                               </attributes>
                               <element jsfid="outputText" renderId="2">
                                       <attributes>
                                               <set name="value"

value="#{messages['navnpanel.text']}">
                                               </set>
                                       </attributes>
                               </element>
                       </element>
                       <element jsfid="outputLabel" renderId="2">
                               <attributes>
                                       <set name="value"
value="#{messages['navnpanel.text']}"></set>
                               </attributes>
                       </element>
               </element>
       </component>

It is supposed to render a fieldset with a legend, and a label inside it.
However the label never appears and there are no errors what so ever.

I think you might need to look at your renderIds.  The renderId
attribute is a way of ordering component children.  RenderIds are only
relevant for sibling elements.  If you have 2 sibling elements with
the same renderId value then one of the elements will be
"lost/replaced".

In your case the t:htmlTag and outputLabel both have the same parent
(t:htmlTag) but they also use the same renderId (2).  They should
instead be 1 and 2.

My renderIds usually start at 1 for each element set and increment
from there.  I think only the relative values matter, so you could
have renderIds 6 and 3 and you would still get 2 children with the 3
renderId as the first child.

With inheritance you are able to override a component's children
selectively by specifying another component with the same renderId.

<component jsfid="c1" extends="clay">
  <element jsfid="outputText" renderId="1">...</element>
 <element jsfid="outputText" renderId=2">...</element>
</component>

<component jsfid="c2" extends="c1">
<element jsfid="inputText" renderId=2">..</element>
</component>

both c1 and c2 produce a clay component with 2 children.  c2 uses
inheritance and the renderId attribute to override the second
outputText in c1 with an inputText.  But, c2 still inherits the first
outputText child from c1.

Hope this helps.


Hermod



Reply via email to