我有一个JSF表单,上面有一个selectBooleanCheckbox。如果该复选框的值为true,则要在其旁边显示组合框。但是不知何故它不起作用。
这是我的代码:
<h:outputText value="Condition"/> <h:selectBooleanCheckbox id="provisioningTargetCollector" value="#{targetSource.provisioningTargetCollector}" disabled="#{!sp:hasRight(facesContext, 'ManageApplication')}" readonly="#{!sp:hasRight(facesContext, 'ManageApplication')}"> <f:ajax render="targetCollectorsGroup" /> </h:selectBooleanCheckbox> <h:outputText value="Provisioning Target Collector"/> <h:panelGroup id="targetCollectorsGroup"> <a4j:outputPanel id="targetCollectors"> <h:selectOneMenu id="collector" value="#{targetSource.selectedTargetCollector}" rendered="#{empty targetSource.object.id}" disabled="#{!sp:hasRight(facesContext, 'ManageApplication')}" readonly="#{!sp:hasRight(facesContext, 'ManageApplication')}"> <f:selectItem itemValue="" itemLabel="#{msgs.select_provisioning_target_collector}"/> <f:selectItems value="#{targetSource.targetCollectors}"/> </h:selectOneMenu> <h:selectOneMenu id="fixedTargetCollector" value="#{empty targetSource.selectedTargetCollector ? 'None' : targetSource.selectedTargetCollector}" rendered="#{not empty targetSource.object.id}" disabled="true" readonly="true"> <f:selectItem itemValue="#{empty targetSource.selectedTargetCollector ? 'None' : targetSource.selectedTargetCollector}" itemLabel="#{empty targetSource.selectedTargetCollector ? msgs.none : targetSource.selectedTargetCollector}"/> </h:selectOneMenu> </a4j:outputPanel> </h:panelGroup>
Bean类方法:
private boolean _provisioningTargetCollector; public boolean isProvisioningTargetCollector() { return _provisioningTargetCollector; } public void setProvisioningTargetCollector(boolean provisioningTargetCollector) { _provisioningTargetCollector = provisioningTargetCollector; }
注意:从FireBug复制
这是POST请求:
AJAX:EVENTS_COUNT 1 editForm editForm editForm:collector editForm:collectorType editForm:dsCorrelationRul... editForm:dsCreationRule editForm:dsDescription editForm:dsName editForm:id 2c90950048166abc0148177755040025 editForm:selectedTargetsF... editForm:type Active Directory - Direct javax.faces.ViewState 1920301575480395177:8510885827764100150 javax.faces.behavior.even... click javax.faces.partial.ajax true javax.faces.partial.event click javax.faces.partial.execu... editForm:provisioningTargetCollector editForm:provisioningTargetCollector javax.faces.partial.rende... editForm:targetCollectorsGroup javax.faces.source editForm:provisioningTargetCollector rfExt null
响应:
<?xml version='1.0' encoding='UTF-8'?> <partial-response><changes><update id="editForm:targetCollectorsGroup"><![CDATA[<span id="editForm:targetCollectorsGroup"><span id="editForm:targetCollectors"><select id="editForm:collector" name="editForm:collector" size="1"> <option value="">Select a Provisioning Target Collector ...</option> <option value="AD Test">AD Test</option> <option value="ADWindow">ADWindow</option> <option value="ADTestSth">ADTestSth</option> </select></span></span>]]></update><update id="javax.faces.ViewState"><![CDATA[1920301575480395177:8510885827764100150]]></update><extension id="org.richfaces.extension"><render>editForm:targetCollectorsGroup</render></extension></changes></partial-response>
实际上,实现所需功能的直接方法是根据复选框的选择重新呈现组合框。这可以通过以下方式完成:
<h:selectBooleanCheckbox binding="#{checkbox}"> <f:ajax render="group" /> </h:selectBooleanCheckbox> <h:panelGroup id="group"> <h:selectOneMenu ... rendered="#{checkbox.value}" /> </h:panelGroup>
请注意,该代码在Bean中不需要任何特殊字段,并且UIComponent绑定到了视图。
UIComponent
当然,如果您在模型中需要它,也可以通过bean属性来完成它:
<h:selectBooleanCheckbox value="#{bean.value}"> <f:ajax render="group" /> </h:selectBooleanCheckbox> <h:panelGroup id="group"> <h:selectOneMenu ... rendered="#{bean.value}" /> </h:panelGroup>
同样值得注意的是,通过display在none和之间切换元素的属性,普通的JavaScript也可以实现此功能block。但是请注意,在回发之间必须保持JSF组件的状态一致,以防止可能的恶意攻击威胁。
display
none
block