2012-12-31 26 views
17

不工作我使用primefaces 3.2和JSF 2.0價值變化聽者在primefaces日曆

我的情況是我有文件日期,截止日期和未來日期在我的形式。 當用戶輸入文件日期時,我需要更新bean中的文件日期值,因此它的值可以用作屬性mindate的最後一個日期中的最小日期,因此在下一個日期選擇中。

根據我的知識價值改變監聽器可以執行表單提交,所以我不能使用它。我已經使用p:ajax。但是我仍然無法設置文件日期。由於未設置文件日期,因此用戶可以選擇文件日期日期前的最後日期和下一日期。

caseMaster.xhtml

<p:calendar value="#{caseUitility.caseMaster.fileDate}" id="fileDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true"> 
    <p:ajax event="change" listener="#{caseUitility.dateChange}"/> 
</p:calendar> 

<p:calendar value="#{caseUitility.caseMaster.lastDate}" required="true" id="lastDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true" mindate="#{caseUitility.caseMaster.fileDate}" > 
</p:calendar> 

CaseUitility.java

public void dateChange(ActionEvent ae) { 
    System.out.println("File Date: " + caseMaster.getFileDate()); 
    System.out.println("Hello... I am in DateChange"); 
} 

可以任何指導我什麼我做錯了什麼?

回答

26

在較新版本PrimeFaces的,SelectEvent應該usedsee下面的代碼片段

<p:calendar id="event" value="#{calendarView.date4}"> 
    <p:ajax event="dateSelect" listener="#{calendarView.onDateSelect}" update="msgs" /> 
</p:calendar> 
public void onDateSelect(SelectEvent event) { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 
    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Date Selected", format.format(event.getObject()))); 
} 

在舊版本的primefaces使用DateSelectEvent

<p:ajax event="dateSelect" listener="#{caseUitility.dateChange}"/> 
public void dateChange(DateSelectEvent event) { 
    Date date = event.getDate(); 
    System.out.println("File Date: " + date); 
    System.out.println("Hello... I am in DateChange"); 
} 
+1

非常感謝@Daniel ....你救了我半天......再次感謝。你能告訴我如何知道/瞭解不同類型組件的ajax事件嗎?作爲不提供任何關於事件的幫助的黃素。 – mrugeshthaker

+3

歡迎您,primefaces提供您需要的所有信息,其用戶指南:http://primefaces.org/documentation.html – Daniel

+0

Thanx @ Daniel,它的工作原理 –

17

您應該向您的p:ajax添加更新。使用日期選擇器選擇日期時以及在字段中手動輸入日期時遇到問題。改變事件不是兩種觸發方式。因此我使用了p:ajax和f:ajax來處理不同的事件。

<p:calendar value="#{caseUitility.caseMaster.fileDate}" id="fileDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true"> 
    <p:ajax event="dateSelect" listener="#{caseUitility.dateSelect}" update="lastDate"/> 
    <f:ajax event="change" execute="@this" render="lastDate" listener="#{caseUitility.dateChange}"/> 
</p:calendar> 

而且在豆

public void dateSelect(DateSelectEvent event) { 
    caseMaster.setFileDate(event.getDate()); 
    System.out.println("File Date: " + caseMaster.getFileDate()); 
    System.out.println("Hello... I am in DateChange"); 
} 

public void dateChange(AjaxBehaviorEvent event) throws MWSException { 
    System.out.println("File Date: " + caseMaster.getFileDate()); 
    System.out.println("Hello... I am in DateChange"); 
} 

希望這有助於

+0

使用2種不同的原因ajax標籤,一個p:ajax和一個f:ajax。爲什麼不能同時使用p:ajax? – Chris

+1

@Chris,據他所說,我猜測包含用戶點擊日曆並選擇日期,但不是在更改日期時通過更改文本。在這種情況下,涵蓋了用戶手動更改文本字段中文本的情況。 – Pixelstix

+0

@pixelstix true – roel

0

我認爲你必須考慮這樣做:

<p:calendar id="fileDate" value="#{caseUitility.caseMaster.fileDate}" navigator="true" effect="slideDown" mindate="#{caseUitility.today}" readOnlyInputText="true" pattern="dd/MM/yyyy HH:mm" required="true" showOn="button" autocomplete="false"> 
    <p:ajax event="focus" listener="#{caseUitility.dateChange}" update="lastDate" /> 
</p:calendar> 

public void dateChange() { 
    System.out.println("File Date: " + caseMaster.getFileDate()); 
} 

如果使用 「焦點」 事件,它將在更改或日期時觸發日曆primefaces控件。

1

我的解決辦法:

<p:ajax event="change" listener="#{caseUitility.dateChange}"/> 

而且在豆:

public void dateChange(SelectEvent event) 
{ 
     date = (Date)event.getObject(); 
} 
0

使用AJAX事件作爲dateSelect 像

<p:calendar value="#{caseUitility.caseMaster.fileDate}" id="fileDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true"> 
     <p:ajax event="dateSelect" process="@this" update="lastDate" listener="#{caseUitility.dateChange}"/> 
</p:calendar> 
<p:calendar value="#{caseUitility.caseMaster.lastDate}" required="true" id="lastDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true" mindate="#{caseUitility.caseMaster.fileDate}" > 
</p:calendar> 

監聽器,

public void dateChange(SelectEvent event) { 
    System.out.println("File Date: " + (Date) event.getObject()); 
    System.out.println("Hello... I am in DateChange"); 
} 

但請記住,您不應該在進程中使用任何其他組件ID(意味着在進程中只允許@this),否則偵聽器將無法工作。

0

您可以使用onstartoncomplete(不會出現在primefaces文檔中)。

我解決了與:

<p:calendar 
     id="fromDate" 
     value="#{reportBean.fromDate}" 
     pattern="dd/MM/yyyy" 
     locale="es" 
     maxdate="#{reportBean.untilDate}"> 
     <p:ajax event="dateSelect" 
      onstart="openModal();" 
      oncomplete="closeModal();" 
      update="untilDate div_report"/> 
</p:calendar> 

的Javascript:

function openModal(){ 
    $('#mdlLoading').modal('open'); 
} 
function closeModal(){ 
    $('#mdlLoading').modal('close'); 
} 

希望這有助於有人!