I'm trying to implement a composite component which either displays the information details of a user in plain text or displays them through editable input texts fields if the desired details are those of the user currently connected.
I know that al UI Components can be rendered via the rendered attribute but what about the ones which are not UI Components (for example divs)
<div class = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}"> Name: #{cc.attrs.value.name} Details: #{cc.attrs.value.details} </div> <div class = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}"> <h:form> ... </h:form> </div>
I know that the div doesn't have the rendered attribute and probably I'm not taknig the right approach at all. I could very easily use an JSTL tag but I want to avoid that.
In java server faces, render is an attribute of a JSF component using which we can load one or more other components on completion of the specific action . rendered is another property of a JSF components which will have a boolean value, based on which the component will be rendered .
The right JSF component to represent a HTML <div>
element is the <h:panelGroup>
with the layout
attribute set to block
. So, this should do:
<h:panelGroup layout="block" ... rendered="#{someCondition}"> ... </h:panelGroup>
Alternatively, wrap it in an <ui:fragment>
:
<ui:fragment rendered="#{someCondition}"> <div> ... </div> </ui:fragment>
Or when you're already on JSF 2.2+, make it a passthrough element:
<div jsf:rendered="#{someCondition}"> </div>
Do note that when you'd like to ajax-update a conditionally rendered component, then you should be ajax-updating its parent component instead.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With