如何让PrimeFaces <p:selectOneMenu>调用valueChangeListener?

Bur*_*erd 14 primefaces jsf-2

使用PF 3.0-RC1快照(11/22/2011)

我有一个复合组件.我想在进行选择时调用valueChangeListener,但它似乎没有调用监听器.

以下是组件的代码:

<p:selectOneMenu style="width: 220px;" 
         value="#{customerProfileSessionBean.selectedAccount}"
         valueChangeListener="#{customerProfileSessionBean.accountValueChange}" >
    <f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

支持bean中的侦听器有一个未被调用的print语句(至少我没有在服务器日志中看到它).

还有什么我需要做的是在值改变时调用valueChangeListener吗?我需要使用吗?

另外,在监听器中,是否有传递的ValueChangeEvent?

谢谢.

Bal*_*usC 35

您似乎期望valueChangeListener在客户端发生更改事件时立即调用服务器端的方法.这是不正确的.只有在将表单提交给服务器并且新值不是equals()旧值时才会调用它.

至少有两种方法可以实现您的功能需求:

  1. 添加onchange="submit()"以便JavaScript在您更改值时提交表单:

    <p:selectOneMenu style="width: 220px;" 
       value="#{customerProfileSessionBean.selectedAccount}"
       valueChangeListener="#{customerProfileSessionBean.accountValueChange}"
       onchange="submit()">
        <f:selectItems value="#{sessionBean1.custAccountList}"/>
    </p:selectOneMenu>
    
    Run Code Online (Sandbox Code Playgroud)

    然而,这是非常JSF-1.x-ish并且对用户体验不利.它还将提交(并转换/验证!)所有其他输入字段,这些字段可能不是您想要的.

  2. 相反,请使用ajax监听器,以确定您是否对实际值更改不感兴趣(即旧值对您不感兴趣),但您实际上对更改事件本身感兴趣.您可以使用<f:ajax>以下方法在PrimeFaces组件中执行此操作<p:ajax>:

    <p:selectOneMenu style="width: 220px;" 
       value="#{customerProfileSessionBean.selectedAccount}">
        <p:ajax listener="#{customerProfileSessionBean.accountValueChange}" />
        <f:selectItems value="#{sessionBean1.custAccountList}"/>
    </p:selectOneMenu>
    
    Run Code Online (Sandbox Code Playgroud)

    并用ValueChangeEvent参数替换AjaxBehaviorEvent参数.

  • 你的第二个解决方案非常适用,但只有当我将`<f:ajax`改为`<p:ajax`时...我也认为指出签名或回调方法应该是什么是好的.所以在这种情况下,它将是`public void accountValueChange(ValueChangeEvent event){...} (6认同)
  • @Tim:当提交的值与初始值不同时,将触发值更改侦听器.ajax所做的就是提交表格.这并不像你似乎暗示的那么奇怪.但是,如果您不是在更改本身,而只是在新提交的值中,那么值更改侦听器是该作业的错误工具.另见http://stackoverflow.com/questions/11879138/when-to-use-valuechangelistener-or-fajax-listener/ (2认同)