Jsf 通过选择复选框启用和禁用组件

Jsf 通过选择复选框启用和禁用组件,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我有一个组件,我正在尝试禁用下面的panelGrid <h:selectBooleanCheckbox id="checkboxId" value="#{bean.checked}"> <p:ajax update="panelId" event="click"/> </h:selectBooleanCheckbox> <h:panelGrid id="panelId" re

我有一个组件,我正在尝试禁用下面的panelGrid

<h:selectBooleanCheckbox id="checkboxId" value="#{bean.checked}">
    <p:ajax update="panelId" event="click"/>                                    
</h:selectBooleanCheckbox>
<h:panelGrid id="panelId" rendered="#{!bean.checked}">
    <h:outputLabel>some text</h:outputLabel>
    <h:outputLabel>#registrationBB.registrationModel.homeAddress.actualAddressMathWithRegistration}</h:outputLabel>
</h:panelGrid>
因此,单击复选框不会产生任何效果。check指示符甚至没有出现在checkbox组件和value bean上:checked没有发送到服务器。 我也试着用。出现检查指示灯,但面板未刷新


如何通过复选框使用update right?

下面的示例是我的工作:

<h:form>
    <h:selectBooleanCheckbox id="checkboxId" value="#{indexBean.checked}" >
        <p:ajax event="change" update="panelId" />
    </h:selectBooleanCheckbox>

    <h:panelGrid id="panelId" style="border:solid 1px black;" >
        <h:outputLabel rendered="#{!indexBean.checked}" >some text</h:outputLabel>
        <h:outputText rendered="#{!indexBean.checked}" value="some text 2" />
    </h:panelGrid>
</h:form>

我不得不将事件从单击更改为更改,以使复选框正常工作。另一个问题是,如果不渲染,则找不到要更新的id,因此您希望将渲染属性移动到内部的组件,但仍会更新。

稍有变化。支持bean字段不必是布尔值。如果您有一个带有字段的支持bean:

private List<SelectItem> myStringList;
private String myString;
然后你可以这样做:

<h:form>
    <p:selectOneRadio id="ctlSearchType" value="#{mybean.myString}"  layout="grid" columns="3">
       <f:selectItems value="#{mybean.myStringList}" />
       <p:ajax event="change" update="ctlone,ctltwo"/>
    </p:selectOneRadio>

    <h:panelGrid id="panelId" style="border:solid 1px black;" >
       <p:outputLabel for="ctlone" value="Field one:"/>
       <p:inputText value="#{mybean.whatever}" id="ctlone" size="8" maxlength="10" disabled="#{mybean.myString eq 'one'}"/>
       <p:outputLabel for="ctltwo" value="Field two:"/>
       <p:inputText value="#{mybean.whatevertwo}" id="ctltwo" size="8" maxlength="10" disabled="#{mybean.myString eq 'two'}"/>                         
    </h:panelGrid>
</h:form>

在黑暗中拍摄:试试看。有一些特定的条件不起作用,我相信其中一个条件被包装在一个非PrimeFaces组件中。你有一个h:表单包装所有这些吗?是的,表单是present@BalusC如果我尝试使用event=单击,则两种情况下都不会出现检查指示器您使用的Primefaces版本是什么?这在版本4中不起作用,无论复选框是否被选中,panelGrid都不受影响。@Nab可能是版本3.x。这个问题是在4.0发布前几年提出的。我在5.0中遇到了一个自定义jsf组件的类似问题,我通过将其包装在面板中并更新面板来解决它。可以试试看。@MarkRobinson这是一个问题,另一个问题是如果你不呈现id,找不到要更新的id,因此,您希望使用“SelectItem”将渲染属性移动到内部组件的情况不再常见,因为也支持普通列表,并且selectOneRadio与selectBooleanCheckbox完全不同。
<h:form>
    <p:selectOneRadio id="ctlSearchType" value="#{mybean.myString}"  layout="grid" columns="3">
       <f:selectItems value="#{mybean.myStringList}" />
       <p:ajax event="change" update="ctlone,ctltwo"/>
    </p:selectOneRadio>

    <h:panelGrid id="panelId" style="border:solid 1px black;" >
       <p:outputLabel for="ctlone" value="Field one:"/>
       <p:inputText value="#{mybean.whatever}" id="ctlone" size="8" maxlength="10" disabled="#{mybean.myString eq 'one'}"/>
       <p:outputLabel for="ctltwo" value="Field two:"/>
       <p:inputText value="#{mybean.whatevertwo}" id="ctltwo" size="8" maxlength="10" disabled="#{mybean.myString eq 'two'}"/>                         
    </h:panelGrid>
</h:form>