【问题标题】:JSF ajax behaviour listenerJSF ajax 行为监听器
【发布时间】:2013-01-19 13:49:02
【问题描述】:

我在使用 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>

我的 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;
      }
  }

我知道方法侦听器正在调用,但面板不可见,如果有人可以帮助我?

【问题讨论】:

    标签: events jsf-2


    【解决方案1】:

    有两个问题。

    1. PrimeFaces 组件中需要&lt;p:ajax&gt; 而不是&lt;f:ajax&gt;

    2. 您需要在 ajax 更新中明确指定一个 JSF 组件,以便重新渲染它。使用当前的方法,您基本上不会更新任何内容。使用&lt;f:ajax&gt;,需要在render属性中指定要更新的组件,&lt;p:ajax&gt;update属性中指定。

    此外,还有一些效率低下的情况。您根本不需要侦听器方法和那些大量的布尔属性。您可以直接在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>
    

    另见:

    【讨论】:

    • 我可以更改我的文件 editionBean 吗?或 web.xml 或其他配置文件?
    • 您只需删除未使用的属性和未使用的侦听器方法。
    • 是的,我的 bean 仅包含属性及其 getter 和 setter(我无法发布我的代码,因为我需要 10 个声誉 ^^)
    • 在你看来,&lt;h:column&gt; 在那儿做什么?删除它们。此外,请清楚地描述您的具体问题。上述答案应该可以解决您的问题,但您从未明确确认或否认该解决方案。
    【解决方案2】:

    this answer 中所述,您应该将&lt;h:panelGroup&gt; 组件包装在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>
    

    【讨论】:

    • 非常感谢您的回答,但是当我单击单选按钮时,什么也没有出现...
    • 组件(选择单选和面板组)是否在同一个&lt;h:form&gt;
    • 是的,它在同一个 h:form 中
    • 请注意&lt;f:ajax render&gt; 中的逗号是无效语法。
    • @BalusC 修复了它,有时我对 RichFaces reRender 语法感到困惑。
    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2014-02-06
    • 2018-10-05
    • 2013-05-05
    • 2013-06-14
    • 1970-01-01
    相关资源
    最近更新 更多