JSF ajax行为监听器

时间:2013-01-19 13:49:03

标签: events jsf-2

当我使用selectOneRadio和我的面板的渲染器时,我遇到了问题。

我的cession.xhtml包含此

    <p:selectOneRadio id="options" value="#{editionBean.radioProprietaire}">
      <f:selectItem itemLabel="Particulier" itemValue="particulier" />
      <f:selectItem itemLabel="Societe" itemValue="societe" />
      <f:ajax listener="#{editionBean.listener}"/>
    </p:selectOneRadio>

    <h:panelGroup rendered="#{editionBean.renderSoc}">...</h:panelGroup>
    <h:panelGroup rendered="#{editionBean.renderPart}">...</h:panelGroup>

My EditionBean.class

private boolean renderSoc;
private boolean renderPart;
private String radioProprietaire;

public void listener(AjaxBehaviorEvent event) {
  if(null != radioProprietaire && radioProprietaire.equals("particulier")){
           renderPart = true;
       renderSoc = false;
      }
  else if(null != radioProprietaire && radioProprietaire.equals("societe")){
    renderPart = false;
    renderSoc = true;
      }
  }

我知道方法监听器是调用,但如果有人可以帮助我,那么面板是不可见的?

2 个答案:

答案 0 :(得分:3)

有两个问题。

  1. 您在PrimeFaces组件中需要<p:ajax>而不是<f:ajax>

  2. 您需要在ajax更新中显式指定JSF组件,以便重新呈现它。使用当前的方法,您基本上不会更新任何内容。使用<f:ajax>时,应在render属性中指定要更新的组件,并在<p:ajax>属性中指定update

  3. 此外,还有一些低效率。您根本不需要侦听器方法和许多布尔属性。您可以直接在rendered属性中检查单选按钮值。

    所以,总而言之,这应该做到:

    <p:selectOneRadio id="options" value="#{editionBean.radioProprietaire}">
        <f:selectItem itemLabel="Particulier" itemValue="particulier" />
        <f:selectItem itemLabel="Societe" itemValue="societe" />
        <p:ajax update="groups" />
    </p:selectOneRadio>
    
    <h:panelGroup id="groups">
        <h:panelGroup rendered="#{editionBean.radioProprietaire == 'societe'}">
            ...
        </h:panelGroup>
        <h:panelGroup rendered="#{editionBean.radioProprietaire == 'particulier'}">
            ...
        </h:panelGroup>
    </h:panelGroup>
    

    另见:

答案 1 :(得分:1)

正如this answer中所述,您应该将<h:panelGroup>组件包装在UIContainer内并渲染更大的容器,以使面板变得可见

<p:selectOneRadio id="options" value="#{editionBean.radioProprietaire}">
  <f:selectItem itemLabel="Particulier" itemValue="particulier" />
  <f:selectItem itemLabel="Societe" itemValue="societe" />
  <p:ajax listener="#{editionBean.listener}" render="pnlSoc pnlPart" />
</p:selectOneRadio>

<h:panelGrid id="pnlSoc">
    <h:panelGroup rendered="#{editionBean.renderSoc}">...</h:panelGroup>
</h:panelGrid>
<h:panelGrid id="pnlPart">
    <h:panelGroup rendered="#{editionBean.renderPart}">...</h:panelGroup>
</h:panelGrid>