2015-05-22 2 views
2

У меня есть форма JSF с 2 датами. Дата начала требуется.Форма JSF необходимо обновить:

2 вещи, мне нужно:

  • Когда дата окончания заливается -> Тогда Дни должны быть рассчитаны и заполнены
  • Когда дни заполнены. (Пример: 31) -> Затем должна быть заполнена дата окончания.

Как это можно сделать в JSF?

enter image description here

Моя форма:

<h:form id="date"> 

    <h:panelGrid columns="3"> 
     <p:outputLabel for="startDate" value="Start Date"/> 
     <p:calendar id="startDate" value="#{dateBean.startDate}" required="true" pattern="d MMM yyyy"/> 
     <p:message for="startDate"/> 

     <p:outputLabel for="endDate" value="End Date"/> 
     <p:calendar id="endDate" value="#{dateBean.endDate}" pattern="d MMM yyyy"/> 
     <p:message for="endDate"/> 

     <p:outputLabel for="days" value="Days"/> 
     <p:inputText id="days" value="#{dateBean.days}"/> 
     <p:message for="days"/> 
    </h:panelGrid> 

</h:form> 

Моего Bean:

@Named(value = "dateBean") 
@SessionScoped 
public class DateBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private Date startDate; 
    private Date endDate; 
    private Integer days; 

    //getters and setters 
    ... 
+1

В соответствии с вашими полями даты является формат: MM/dd/yyyy? – drgPP

+0

Правильно: я использовал формат по умолчанию: MM/dd/yyyy –

+1

Вы пишете даты или вы выбираете даты через всплывающий календарь? – Magnilex

ответ

5

Я предпочел бы пойти с встроенным Primefaces способ сделать это. Существует мероприятие под названием dateSelect, который будет срабатывать, когда дата изменилась:

Календарь обеспечивает событие dateSelect поведение Ajax для выполнения мгновенного выбора АЯКС всякий раз, когда выбирается дата. Если вы определяете метод в качестве слушателя, он будет вызван путем передачи экземпляра org.primefaces.event.SelectEvent.

Используя это, endDate будет выглядеть (игнорируя свойство формата даты, который кажется неправильным):

<p:calendar id="endDate" value="#{dateBean.endDate}"> 
    <p:ajax event="dateSelect" listener="#{dateBean.handleDateSelect}" update="days" /> 
</p:calendar> 

Этот регистр будет слушатель будет называться после выбора новой даты. Он будет вызывать ваш фоновый бэк, а затем повторно отобразить поле ввода days, чтобы отобразить новое значение.

В DateBean вы бы затем реализовать этот метод для выполнения логики произойдет после выбора даты:

public void handleDateSelect(SelectEvent event) { 
    Date date = (Date) event.getObject(); 
    // the below method would calculate the difference in days between the dates 
    calculateDaysIfStartDateIsFilled(date); 
} 

Для days тега, я использовал бы p:event, чтобы вызвать событие на изменений, то есть когда значение в изменении поля:

<p:inputText id="days" value="#{dateBean.days}"> 
    <p:ajax event="change" update="endDate" listener="#{dateBean.handleDaysChange}" /> 
</p:inputText> 

И добавьте следующий метод в DateBean выполнить логику:

public void handleDaysChange() { 
    calculateToDateIfStartDateIsFilled(); 
} 
-2

Одно из предложений было бы использовать JSTL format library

Он может направлять вас свои потребности, так что вы может сделать что-то вроде этого:

<fmt:parseNumber 
    value="${(dateBean.endDate - dateBean.startDate)/(1000*60*60*24) }" 
    integerOnly="true" var="daysDifference"/> 

и установить значение поля, как: (Update с помощью JQuery/JavaScript инициирующего изменения на поле End Date)

<p:inputText id="days" value="#{daysDifference}"/> 
Смежные вопросы