2012-04-16 38 views
1

我想在p:calendar中選擇日期後調用bean。在我的設置中,我有一個@Named @ViewScoped Bean,類0123¾是一個@Entity與日期字段validFromPrimefaces p:日曆p:ajax值未更新(一步延遲)

<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-最終
  • 即使沒有p:dataTable,只使用p:calendar問題發送仍然是一樣的。
  • 錯誤對於方法對象update(ObWithDate myO)以及myBean.listObWithDates中的對應條目,可以觀察到調試輸出的值。
  • <p:ajax immediate="true" .../>不能解決此問題。

更新 MattHandy幫了我很多,所產生的問題如何獲得在豆類方法中的Ajax調用相應的列表項?制定在後續JSF p:calendar in p:dataTable: How to get the row of p:ajax dateSelect event

+0

請注意'@ Named'和'@ ViewScoped'不能一起工作。 CDI不知道視圖範圍。也許這不是你具體問題的原因,但現在或以後可能會引起不希望的行爲。 – 2012-04-16 13:52:20

+0

@MattHandy:我使用Seam來增強這個範圍的CDI(http://docs.jboss.org/seam/3/faces/latest/reference/en-US/html/scopes.html#viewscoped),這個像幾頁上的魅力一樣工作。這是落後的一步,而不是落後一天。我更新了這個問題來澄清這一點。 – Thor 2012-04-16 14:08:07

+0

這必須是生命週期問題。該方法設置器在偵聽器執行時調用_before_。監聽器將該值設置回以前的值。 – 2012-04-16 15:35:17

回答

3

這很可能是生命週期問題。在您的監聽器執行之前,您所在領域的setter被稱爲。您不應該使用偵聽器來設置您的值。

上監聽EL表達式在使以前請求的響應相位評估從而保持cum值「一步後面」。

您應該從日曆的日期值的setter更新您的自定義對象。

+0

如果我理解你是正確的,我不應該使用'myBean.update(暨)'而只能使用'myBean.update'。通過這樣做,我仍然期望''listObWithDates'中的'cum'在ajax請求期間被設置,並且我在beans'update()'方法中有實際的值。但也有一些_old_。 – Thor 2012-04-16 18:03:36

+0

爲了更好的理解:你的更新方法實際上在做什麼?你爲什麼需要給它打電話? – 2012-04-16 19:50:35

+0

更新方法應該直接更新數據庫中已更改的日期值。 – Thor 2012-04-17 05:08:04

1

今天早上我遇到了這個問題。發現primefaces從Primefaces 3.5中刪除了DateSelectEvent。因此必須從我的日曆對象中刪除ajax事件調用。而是使用get ..()來檢索值。請在下面的鏈接中查找相同的討論。 http://forum.primefaces.org/viewtopic.php?f=3&t=27590