【问题标题】:Can primefaces calendar make past dates and times disabled?primefaces 日历可以禁用过去的日期和时间吗?
【发布时间】:2012-09-11 21:04:35
【问题描述】:

我正在尝试在网站上弹出日历以允许用户选择日期。这是用于提醒/任务实现。我不希望用户能够选择以前的日期或时间。

任何人为这个问题提供的建议都是mindate="today (get new Date())"。这很好,因为它使前几天无法被选中。但是,人们仍然可以选择今天的某个时间,即之前到现在。因此,人们自然会选择minHourminMinute,但这些也会保留在未来的日子里。因此,如果我设置了所有这 3 个,我们将接近,但问题是,如果我选择明天的日期,它将只允许基于 minMinuteminHour 的一天中的时间,它们基于您的系统时间为"today (get new Date())"。您应该可以选择明天的任何时间。

我可以让日历只在“现在”之后的日子和时间有效吗?

这似乎是一个自然的环境。 futureDates="disabled"pastDates="disabled"

【问题讨论】:

    标签: javascript calendar primefaces


    【解决方案1】:

    我猜默认情况下不可能在同一个日历组件中完成所有这些操作。因为它要求您在用户选择日期后更改 minHourminMinute 的值。这意味着日历组件需要再次渲染。

    您可以将其分为两个部分:一个仅用于选择日期,另一个用于选择时间。

    然后您可以在用户选择日期时进行 ajax 调用,并根据所选日期重新渲染时间组件,并根据所选日期设置 minHourminMinute

    这就是 xhtml 的样子:

    <p:calendar id="dateOnly" mindate="#{datePickerView.minDate}"
        value="#{datePickerView.chosenDate}">
    
        <p:ajax event="dateSelect" listener="#{datePickerView.handleDateSelect}" update="timeOnly" />  
    </p:calendar>
    
    <br />
    
    <p:calendar id="timeOnly" value="#{datePickerView.chosenTime}" 
        pattern="HH:mm" timeOnly="true" minHour="#{datePickerView.minHour}" 
        minMinute="#{datePickerView.minMinute}" />
    

    这就是 bean 的样子:

    public class DatePickerView implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private Date chosenDate;
        private Date chosenTime;
    
        public void handleDateSelect(DateSelectEvent event) {
            chosenDate = event.getDate();
        }
    
        public Date getMinDate() {
            return Calendar.getInstance().getTime();
        }
    
        public int getMinHour() {
            if (chosenDate.after(Calendar.getInstance().getTime())) {
                return 0;
            } else {
                return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
            }
        }
    
        public int getMinMinute() {
            if (chosenDate.after(Calendar.getInstance().getTime())) {
                return 0;
            } else {
                return Calendar.getInstance().get(Calendar.MINUTE);
            }
        }
    
        public Date getChosenDate() {
            return chosenDate;
        }
    
        public void setChosenDate(Date chosenDate) {
            this.chosenDate = chosenDate;
        }
    
        public Date getChosenTime() {
            return chosenTime;
        }
    
        public void setChosenTime(Date chosenTime) {
            this.chosenTime = chosenTime;
       }
    }
    

    您当然应该添加时区处理等。

    【讨论】:

    • 感谢您的回复。我也想过打破这个,但我不想为用户添加更多点击。最后可能不得不。实现方式是,从下拉列表中选择提醒频率,即每天每周或一次。然后,根据选择,我渲染了一个日历,它只显示每天的时间,以及每周或一次的完整日历。添加另一个选择可能不会让设计人员满意,并且还会导致我连接将间隔运行的提醒部署作业的日期字符串。再次感谢您的帮助!
    • 也许您可以提出您的想法,即通过属性 (futureDates="disabled") 作为 primefaces 页面上日历组件的附加功能来控制它?
    • 我试着去那里但是有问题?!?我创建了一个帐户,但它一直锁定。说我的帐户不活跃,不允许在网站上搜索。不知道那里发生了什么,但是是的,我可以建议将其作为附加功能,只是现在没有太大帮助。
    • 我在 primefaces 问题跟踪器上创建了一个“新功能请求”票证:code.google.com/p/primefaces/issues/detail?id=4630(虽然找不到将其标记为功能请求的方法)。
    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多