值更改侦听器无法在primefaces日历中工作

时间:2012-12-31 08:47:43

标签: ajax jsf-2 primefaces

我正在使用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");
}

可以指导我在这里做错了吗?

6 个答案:

答案 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)

您可以使用onstartoncomplete(不会出现在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');
}

希望这能有所帮助!