2017-07-19 133 views
1

我對Primefaces的工作邏輯還有一個誤解。Primefaces日曆沒有設置日期

現在<p:calendar>當我按下提交按鈕時,組件不能設置選定的日期。
我看到它已成功進入actionListener方法,但日期值爲空。

首先,我嘗試使用標準PF example創建我的日曆。它看起來太簡單了,我認爲在用戶選擇日期或提交表單時,組件應該調用值設置器。但是它在第一個和第二個案例中都沒有做到。 好了,我打開谷歌和發現了幾個帖子:

Primefaces Calendar Setting Date Value in Backing Bean
p:calendar value not set in backing bean

我保證,我的日曆位於<h:form></h:form>標籤之間。另外我試着加入process="@this"process=":beginDateForm :endDateForm @this",其中beginDateForm和endDateForm是包含<p:calendar>組件的表單。
此外,我發現post,並試圖創造SelectEvent監聽方法:

private void changeDate(SelectEvent event) { 
    beginDate = (Date) event.getObject(); 
} 

但沒有成功。

我也嘗試使用valueChangeListener變更日期:

<h:form id="beginDateForm"> 
    <p:calendar id="passBeginDate" valueChangeListener="#{territoryFormBean.changeDate}" mode="popup" readonly="true" pattern="dd.MM.yyyy" showOn="button" value="#{territoryFormBean.beginDate}" /> 
</h:form> 

當然我改變事件ValueChangeEvent。

之後我移動<p:calendar><p:commandButton>部件到相同<h:form>並試圖兩個不同的過程值process="passTerrForm:passBeginDate passTerrForm:passEndDate @this"process="@form @this"process="@form" 在最後一種情況按鈕不會觸發甚至偵聽方法。

我目前的組成部分是:

<p:commandButton value="Search" id="searchPassButton" actionListener="#{territoryFormBean.search}" update=":passTerrForm:territoryTable" process="passTerrForm:passBeginDate passTerrForm:passEndDate @this" partialSubmit="true" /> 

<p:column> 
    <p:calendar id="passBeginDate" mode="popup" readonly="true" pattern="dd.MM.yyyy" showOn="button" value="#{territoryFormBean.beginDate}" /> 
</p:column> 
<p:column> 
    <p:calendar id="passEndDate" mode="popup" readonly="true" pattern="dd.MM.yyyy" showOn="button" value="#{territoryFormBean.endDate}" /> 
</p:column> 

傢伙,你可以請建議別的。或者你可能會看到我的代碼有什麼問題。 我不明白爲什麼組件不會調用setter。

+0

該代碼會引發一些錯誤? –

+0

@PolRodríguezno。它不是。我查了NetBeans輸出,發現只有Fine和Finest的消息有'組件創建' –

+0

順便說一下,我也檢查了位於同一頁面的輸入字段是否正確提交。我可以在調試模式下看到java字段具有正確的值。 –

回答

0

試圖與我有一個代碼,一個比喻,我認爲把按鈕進入相同的形式日曆,並省略了「過程」和「partialSubmit」應該工作:

<h:form id="beginDateForm"> 
    <p:calendar id="passBeginDate" valueChangeListener="#{territoryFormBean.changeDate}" mode="popup" readonly="true" pattern="dd.MM.yyyy" showOn="button" value="#{territoryFormBean.beginDate}" /> 
    <p:commandButton value="Search" id="searchPassButton" actionListener="#{territoryFormBean.search}" update=":passTerrForm:territoryTable" /> 
    </h:form> 

我希望它有幫助!

+0

嗨!感謝您的回覆。我試圖做到這一點,但不幸的是它沒有幫助。 所有inputText字段和選擇菜單傳遞值,但日曆不是:( –

+0

你應該在上面的代碼中省略valueChangeListener,我在我的回覆中跳過了這個細節 – imnothatrobot

+0

那麼,現在我刪除了valueChangeListener並返回到初始教程配置。但是我不能刪除'process'參數,否則form甚至不會將inputText字段值傳遞到託管bean。 –

0

JSF代碼:

<p:calendar id="from" value="#{pageBean.event.startDate}" pattern="MM/dd/yyyy hh:mm:ss a" timeZone="GMT-4"/> 

<p:commandButton id="addButton" value="Save" actionListener="#{pageBean.addEvent}" update=":@form"/> 

,你需要這些日曆事件添加到eventModel並保存你可以寫在Bean的的addEvent方法。這有助於您設置日期,並且可以根據需要隨時檢索日期。

Java代碼:

private ScheduleModel eventModel; 
private ScheduleEvent event = new DefaultScheduleEvent(); 
public String addEvent(ActionEvent actionEvent) {  

    if(event.getId() == null){ 
     eventModel.addEvent(event); 
    } 
} 

希望這有助於!

+0

我仍然無法理解事件模型的概念,我會調查它,但它確實看起來很奇怪。日期可以簡單地通過在java後端具有日期類型的值參數傳遞 –

+0

您是否獲得日曆事件保存工作? –

+0

現在我不需要手動處理日曆事件了,對於我的目標來說,這已經足夠了選擇日期並通過提交將其傳遞給託管bean按鈕。正如我已經寫了,我發現了錯誤,並可以使用默認的方式來設置日期。 –

2

好吧,夥計們,我發現我的錯誤。愚蠢的錯誤。又一次重新閱讀PF文檔顯示,使用readonly參數對我的目標不正確。我想防止手動日期輸入直接進入<p:calendar>文本字段。但是根據文檔: readonly -

標誌,指示該輸入元素將防止由 用戶

變化,但我需要readonlyInput參數,

使的輸入文本彈出日曆只讀。

因此,第二個參數可以防止輸入,而第一個參數可以防止輸入完全變化。
謝謝你的幫助。