Primefaces p:日历与p:ajax值未更新(一步延迟)

时间:2012-04-16 13:48:02

标签: ajax jsf-2 primefaces seam3

我希望在p:calendar中选择日期后调用bean。在我的设置中,我有@Named @ViewScoped Bean,类ObWithDate@Entity,日期字段 validFrom

<h:form id="fUser">
  <p:dataTable id="dt" var="cum" value="#{myBean.listObWithDates}">
    <p:column>
      <p:calendar id="cValidFrom" value="#{cum.validFrom}">  
        <p:ajax event="dateSelect" listener="#{myBean.update(cum)}"
                update=":fUser:dt"/>  
      </p:calendar>  
    </p:column>
  </p:dataTable>
</h:form>

好处是,每次选择日期时都会使用正确的对象调用bean方法update(ObWithDate myO)。不好的是,myO.validFrom没有正确的值。它总是落后

  • 字段已初始化为2012-01-01
  • GUI更改为2012-01-05,bean方法调试到2012-01-01
  • GUI更改为2012-01-15,bean方法调试到2012-01-05

这个问题让我发疯,我发现了一些未正确更新值的问题以及一些关于p:calendar的问题。他们中的大多数建议使用属性selectListener="#{calendarBean.handleDateSelect}"handleDateSelect(DateSelectEvent event)方法。但我想调用我的方法,因为我想传递变量的当前实例。

  • Firebug验证,在POST请求中传输了正确的更新值
  • 我使用的是Primefaces 3.2和JBoss-7.1.1-Final
  • 即使没有p:dataTable且只使用p:calendar,问题仍然存在。
  • 对于方法对象update(ObWithDate myO)以及myBean.listObWithDates中的相应条目,可以观察到调试输出的错误值。
  • <p:ajax immediate="true" .../>无法解决此问题。

更新 MattHandy给了我很多帮助,结果问题如何在beans方法中的ajax调用中获取相应的列表项?在后续{{em>中制定3}}

2 个答案:

答案 0 :(得分:3)

这很可能是生命周期问题。在您的侦听器执行之前,您的字段的setter称为。您不应该使用侦听器来设置您的值。

侦听器上的el表达式在上一个请求的呈现响应阶段进行评估,因此它保持cum值“落后一步”。

您应该从日历日期值的设置者更新自定义对象。

答案 1 :(得分:1)

今天早上我遇到了这个问题。发现primefaces已从Primefaces 3.5中删除了DateSelectEvent。因此必须从我的日历对象中删除ajax事件调用。而是使用get ..()检索值。请在下面的链接中找到相同的讨论。 http://forum.primefaces.org/viewtopic.php?f=3&t=27590