【问题标题】:JSF+Primefaces p:ajax on p:selectOneMenu not firingJSF+Primefaces p:ajax on p:selectOneMenu 未触发
【发布时间】:2026-02-25 14:20:04
【问题描述】:

我有一个下拉列表,其中包含一个帐号和两个日期字段。如果我更改下拉列表的值,我想重置日期字段。我还有一个搜索按钮,可以使用这些字段(帐户号、从日期到日期)进行查询。

<fieldset>
    <p:selectOneMenu id="account_search" value="#{accountHistoryBean.account}" converter="accountConverter">
        <f:attribute name="itemsList" value="#{accountHistoryBean.userAccounts}"/>
        <f:selectItems value="#{accountHistoryBean.userAccounts}" var="account" itemLabel="#{account.number}" itemValue="#{account}"/> 
        <p:ajax update="start_date_search, end_date_search" event="change" actionListener="#{accountHistoryBean.resetDates}" process="account_search"/> 
    </p:selectOneMenu>
<fieldset>

<fieldset>
    <p:calendar value="#{accountHistoryBean.fromDate}" id="start_date_search" pattern="dd/MM/yyyy"/>
</fieldset>

<fieldset>
    <p:calendar value="#{accountHistoryBean.toDate}" id="end_date_search" pattern="dd/MM/yyyy"/>
</fieldset>



<fieldset>
    <p:commandLink styleClass="regular_button" action="#{accountHistoryBean.search}" update=":search :accountHistoryList :accountHistoryList:accountHistTable" >
        <span>#{msj.search}</span>
     </p:commandLink>
 </fieldset>

如果我执行以下操作:

  1. 更改“从日期”和“到日期”字段
  2. 更改帐户字段(带有 ajax 的下拉菜单)。

然后将日期重置为其默认值。

但如果我执行以下操作:

  1. 将“从日期”和“到日期”字段更改为 DATEX 和日期
  2. 按搜索
  3. 将“from Date”和“to Date”字段更改为 DATEX2 AND DATEY2
  4. 更改帐户字段(带有 ajax 的下拉菜单)。

然后它将日期字段更改为 DATEX 和 DATEY(不是默认值)。

Bean中的方法如下:

public void resetDates()
{
    Calendar calendar = GregorianCalendar.getInstance();
    //By default set toDate as 3/3
    calendar.set(Calendar.MONTH, 2);
    calendar.set(Calendar.DAY_OF_MONTH, 3);
    toDate = calendar.getTime();
    //By default fromDate is one month earlier
    calendar.setTime(toDate);
    calendar.add(Calendar.MONTH, -1);
    fromDate = calendar.getTime();
}

public String search(){
    //Just update the filters
    lazyDataEntityModel.setUpdateData(true);
    return null;
}

有什么帮助吗?

【问题讨论】:

  • 第 4 步中是否调用了您的侦听器方法?你用调试器验证了吗?
  • 我做了类似的事情,我发现我在jsf转换器中出错了,但错误消息从未显示。你检查了account的jsf转换器吗?
  • @MattHandy 我的监听器没有被调用。

标签: jsf primefaces


【解决方案1】:

我变了

<p:ajax update="start_date_search, end_date_search" 
        event="change" 
        actionListener="#{accountHistoryBean.resetDates}"
        process="account_search"/> 

对于

<p:ajax update="start_date_search, end_date_search" 
        event="change"
        listener="#{accountHistoryBean.resetDates}" 
        process="account_search"/> 

它成功了。

谢谢

【讨论】:

    【解决方案2】:

    正确答案是关于转换器。检查 h:selectOneMenu 中的 value 属性!未正确映射。如果您仍然有疑问,请设置 immediate="true",这样任何转换器或验证器都不会完成他们的工作。这就是我所做的,并且工作了...... 4 - 6 小时后......:|

    感谢您关于转换器的想法,这是为我提供正确答案的提示。

    【讨论】: