2012-12-31 28 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'); 
} 

希望这有助于有人!