我正在使用primefaces 3.2和JSF 2.0
我的方案是我的表单中有文件日期,上次日期和下一个日期。 当用户输入文件日期时,我需要更新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");
}
可以指导我在这里做错了吗?
答案 0 :(得分:35)
在PrimeFaces的更新版本中,应使用 SelectEvent
,请参阅以下代码段
<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 :(得分:18)
您应该为p:ajax添加更新。使用datepicker选择日期时以及在字段中手动输入日期时遇到问题。变更事件未被双向触发。因此我使用了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");
}
希望这有帮助
答案 2 :(得分:1)
我的解决方案:
<p:ajax event="change" listener="#{caseUitility.dateChange}"/>
在豆子里:
public void dateChange(SelectEvent event)
{
date = (Date)event.getObject();
}
答案 3 :(得分: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());
}
如果您使用“焦点”事件,它将在更改时触发,或者日历主要控件的日期选择将被触发。
答案 4 :(得分:0)
将ajax事件用作dateSelect 像
when
监听器,
<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>
但请记住,您不应该在进程中使用任何其他组件ID(意味着只允许@this进程)否则侦听器将无法工作。
答案 5 :(得分:0)
您可以使用onstart
和oncomplete
(不会出现在primefaces doc中)。
我解决了这个问题:
<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');
}
希望这能有所帮助!