根据h:selectOneMenu值隐藏和显示组件

时间:2012-11-28 05:09:14

标签: ajax jsf

我有一个<h:selectOneMenu>的页面,我想显示一些字段或其他字段,具体取决于所选的菜单值。这是可能的,如果是的话,怎么样?

<h:selectOneMenu id="productname" value="#{product.productname}" required="true"> 
    <f:selectItem itemLabel="select" itemValue="null" />  
    <f:selectItem itemLabel="Detetgent" itemValue="Detergent"/>  
    <f:selectItem itemLabel="Dishwash" itemValue="Dishwash" />  
    <f:selectItem itemLabel="Powder" itemValue="Powder" />  
    <f:selectItem itemLabel="Liquid" itemValue="Liquid" />       
</h:selectOneMenu>
<h:panelGroup rendered="Detergernt">
    <p>This will be shown if the selected item Detergent.</p>
</h:panelGroup>
<h:panelGroup >
    <p>This will be shown if the selected item Dishwash.</p>
</h:panelGroup>
<h:panelGroup >
    <p>This will be shown if the selected item equal to powder.</p>
</h:panelGroup>
<h:panelGroup >
    <p>This will be shown if the selected item equals to Liquid.</p>
</h:panelGroup>

3 个答案:

答案 0 :(得分:4)

如果rendered返回所需的值,您只需要检查#{product.productname}属性。为了更新所有这些组件,您应该在菜单中添加<f:ajax>,以更新所有有条件渲染组件的始终渲染的公共父组件。

<h:selectOneMenu id="productname" value="#{product.productname}" required="true"> 
    <f:selectItem itemLabel="select" itemValue="null" />
    <f:selectItem itemLabel="Detetgent" itemValue="Detergent"/>
    <f:selectItem itemLabel="Dishwash" itemValue="Dishwash" />
    <f:selectItem itemLabel="Powder" itemValue="Powder" />
    <f:selectItem itemLabel="Liquid" itemValue="Liquid" />
    <f:ajax render="groups" />
</h:selectOneMenu>
<h:panelGroup id="groups">
    <h:panelGroup rendered="#{product.productname == 'Detergent'}">
        <p>This will be shown if the selected item Detergent.</p>
    </h:panelGroup>
    <h:panelGroup rendered="#{product.productname == 'Dishwash'}">
        <p>This will be shown if the selected item Dishwash.</p>
    </h:panelGroup>
    <h:panelGroup rendered="#{product.productname == 'Powder'}">
        <p>This will be shown if the selected item equal to Powder.</p>
    </h:panelGroup>
    <h:panelGroup rendered="#{product.productname == 'Liquid'}">
        <p>This will be shown if the selected item equals to Liquid.</p>
    </h:panelGroup>
</h:panelGroup>

另见:

答案 1 :(得分:0)

是的,你可以做到这一点。请粘贴您的页面,以便我在网页上自行解释。

我们的想法是使用<a4j:outputPanel>作为容器,<h:panelGrourp layout="block" rendered="#{}">作为需要隐藏的字段的包装器。
选定的selectOneMenu值将用于rendered的{​​{1}}属性。

答案 2 :(得分:0)

<h:selectOneMenu id="productname" value="#{product.productname}" required="true"> 
    <f:selectItem itemLabel="select" itemValue="null" />  
    <f:selectItem itemLabel="Detetgent" itemValue="Detergent"/>  
    <f:selectItem itemLabel="Dishwash" itemValue="Dishwash" />  
    <f:selectItem itemLabel="Powder" itemValue="Powder" />  
    <f:selectItem itemLabel="Liquid" itemValue="Liquid" />    
    <p:ajax event="onselect" update="selectedOp" listener="#{product.updateSelectedValue}" />
</h:selectOneMenu>
<h:panelGroup rendered="{product.updateSelectedValue ne null}" id="selectedOp">
    <p>This will be show selected value</p>
    #{product.updateSelectedValue}
</h:panelGroup>

这是您可以从页面上的下拉菜单中显示所选值的方法。我假设您使用的是PrimeFaces,因此在<p:ajax>内使用ajax事件标记<h:selectOneMenu >。同时在<h:panelGroup rendered="{product.updateSelectedValue ne null}">上添加条件,以便在选定的值不是null时显示。