【问题标题】:Enabling and disabling components via select checkbox通过选择复选框启用和禁用组件
【发布时间】:2011-10-09 22:56:05
【问题描述】:

我有组件,我正在尝试禁用下面的 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>

因此,单击复选框不会生效。检查指示器甚至不会出现在复选框组件上,并且值 bean:checked 不会发送到服务器。 我也试过用。检查指示器出现但面板未刷新

如何通过复选框使用更新?

【问题讨论】:

  • 在黑暗中拍摄:改用&lt;f:ajax event="click" render="panelId" /&gt;。在某些特定情况下,&lt;p:ajax&gt; 不起作用,我相信其中一个被包装在非 PrimeFaces 组件中。
  • 你有一个h:form 包裹所有这些吗?
  • 是的,表格存在
  • @BalusC 如果我尝试使用 event="click" 两种情况下都不会出现检查指示器

标签: jsf jsf-2 primefaces


【解决方案1】:

略有不同。您的支持 bean 字段不必是布尔值。如果你有一个带字段的支持 bean:

private List<SelectItem> myStringList;
private String myString;

然后在表单加载之前像这样初始化 myStringList:

myStringList = Arrays.asList(new SelectItem("one", "The Number One"),
                new SelectItem("two", "The number two")
        );

那么你可以这样做:

<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>

【讨论】:

  • 使用“SelectItem”已经不是很常见了,因为普通列表也受支持,而且 selectOneRadio 与 selectBooleanCheckbox 完全不同。
【解决方案2】:

下面的例子是我要做的:

<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>

我必须将 &lt;p:ajax&gt; 事件从单击更改为更改以使复选框正常工作。另一个问题是,如果您不渲染 &lt;h:panelGrid&gt;,则无法找到要更新的 id,因此您希望将渲染属性移动到 &lt;h:panelGrid&gt; 内的组件中,但仍要更新 &lt;h:panelGrid&gt;

【讨论】:

  • 您使用的是什么版本的 Primefaces?这在版本 4 中不起作用,无论是否选中复选框,panelGrid 都不受影响。
  • @Nab 可能是版本 3.x 的东西。这个问题是在 4.0 发布前几年提出的。
  • 我在 5.0 中遇到了与自定义 jsf 组件类似的问题,我通过将其包装在面板中并改为更新面板来解决它。可以试试。
  • @MarkRobinson 这就是问题所在 另一个问题是,如果您不渲染 &lt;h:panelGrid&gt;,则找不到更新的 id,因此您希望将渲染属性移动到您的组件中&lt;h:panelGrid&gt;
猜你喜欢
  • 2015-02-03
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 2012-11-10
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
相关资源
最近更新 更多