PrimeFaces日历范围

时间:2014-12-24 10:21:38

标签: jsf primefaces

我使用PrimeFaces日历表示日期范围(为此我使用两个日历)。 如何在运行时更改日期范围,以便第一个日历范围将小于或等于第二个日历值。例如,时间范围:http://www.primefaces.org/showcase-ext/sections/timePicker/timeRange.jsf

2 个答案:

答案 0 :(得分:7)

您只需要使用p:ajax和dateSelect事件,并在ManageBean方法中更新第二个日历的最小日期范围

实施例: -

    <p:calendar id="fromDate" value="#{calendarView.fromDate}">
        <p:ajax event="dateSelect" listener="#{calendarView.onDateSelect}" update="toDate" />
    </p:calendar>

    <p:calendar id="toDate" value="#{calendarView.toDate}"  mindate="#{calendarView.toDateMin}"/>

希望这可以帮助你:)

答案 1 :(得分:0)

上一个答案的补充:

这会做得很好,但不是一件完整的事情,即使您手动编辑它,也可以通过,并且范围将为false。 为此,您需要实现一个自定义的JSF日期验证器。

@FacesValidator("primeDateRangeValidator")
public class PrimeDateRangeValidator implements Validator {

@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if (value == null) {
        return;
    }

    //Leave the null handling of startDate to required="true"
    Object startDateValue = component.getAttributes().get("fromDate");
    if (startDateValue==null) {
        return;
    }

    Date startDate = (Date)startDateValue;
    Date endDate = (Date)value; 
    if (endDate.before(startDate)) {
        throw new ValidatorException(
                FacesMessageUtil.newBundledFacesMessage(FacesMessage.SEVERITY_ERROR, "", "msg.dateRange", ((Calendar)component).getLabel(), startDate));
    }
}

}

并将其添加到您的日历中

<f:validator validatorId="primeDateRangeValidator" />