primefaces schedule:在move / resize事件监听器上编辑事件详细信息

时间:2012-11-16 12:43:30

标签: java jsf-2 primefaces

我正在摆弄schedule demo code from the primefaces showcase(使用版本3.3.1),我需要在move / resize事件监听器上调整计划的itens的一些值。 (我将使用“计划项目”来提及数据模型对象“计划的事件”,并为用户交互的API触发响应保留术语“事件”。)

因此,每当用户移动/调整界面上的预定项目时,已注册的事件侦听器将触发,显示该天增量,分钟增量消息,如展示示例所示。

但我需要对该项进行一些修改,即:

a)确保计划的项目不会在周末(也是假日)开始/结束,但让我们忽略这一点。将项目的开头/结尾移回前一个工作日(如果它从周末开始)或下一个工作日(如果它在周末结束)

b)使项目捕捉到最接近的四分之一小时。

c)确保计划的项目不会在早上700点之前或2100点之后开始/结束。如果超过这些限制,则将开始/结束时间限制为这些限制。

并在用户界面上显示结果更改。但是我无法在事件监听器方法期间编辑数据模型。

以下是日程安排标记:

                    <p:schedule value="#{scheduleController.eventModel}"
                        widgetVar="myschedule" view="agendaWeek" allDaySlot="false"
                        slotMinutes="15" firstHour="7" showWeekends="FALSE"
                        leftHeaderTemplate="prev,next" rightHeaderTemplate=""
                        minTime="7am" maxTime="21pm" timeFormat="dd/MM H:mm{ - dd/MM H:mm}"
                        axisFormat="HH" timeZone="#{rotulo.timeZone}">

                        <p:ajax event="dateSelect"
                            listener="#{scheduleController.onDateSelect}"
                            update="eventDetails" oncomplete="eventDialog.show()" />
                        <p:ajax event="eventSelect"
                            listener="#{scheduleController.onEventSelect}"
                            update="eventDetails" oncomplete="eventDialog.show()" />
                        <p:ajax event="eventMove"
                            listener="#{scheduleController.onEventMove}" update="messages" />
                        <p:ajax event="eventResize"
                            listener="#{scheduleController.onEventResize}" update="messages" />

                    </p:schedule>

托管bean方法......

    public void onEventMove(ScheduleEntryMoveEvent event) {  
        doBusinessLogic((DefaultScheduleEvent) event.getScheduleEvent());
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Event moved", "Day delta:" + event.getDayDelta() + ", Minute delta:" + event.getMinuteDelta());  

        addMessage(message);  
    }  

    public void onEventResize(ScheduleEntryResizeEvent event) {  
        doBusinessLogic((DefaultScheduleEvent) event.getScheduleEvent());
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Event resized", "Day delta:" + event.getDayDelta() + ", Minute delta:" + event.getMinuteDelta());  

        addMessage(message);  
}  

doBusinessLogic()内部,我会调整时间值。如何在DefaultScheduleEvent反映日程表的数据模型时对其进行更改?

1 个答案:

答案 0 :(得分:1)

代码很好,通过调试数据模型,业务逻辑实际上正在更新计划项目。

问题出在视图更新中。 p:ajax调用的update属性应该是整个表单,而不仅仅是eventDetails或消息。

因此,将jsf页面更改为:

 <p:schedule value="#{scheduleController.eventModel}"
                        widgetVar="myschedule" view="agendaWeek" allDaySlot="false"
                        slotMinutes="15" firstHour="7" showWeekends="FALSE"
                        leftHeaderTemplate="prev,next" rightHeaderTemplate=""
                        minTime="7am" maxTime="21pm" timeFormat="dd/MM H:mm{ - dd/MM H:mm}"
                        axisFormat="HH" timeZone="#{rotulo.timeZone}">

                        <p:ajax event="dateSelect"
                            listener="#{scheduleController.onDateSelect}"
                            update="MYFORM" oncomplete="eventDialog.show()" />
                        <p:ajax event="eventSelect"
                            listener="#{scheduleController.onEventSelect}"
                            update="MYFORM" oncomplete="eventDialog.show()" />
                        <p:ajax event="eventMove"
                            listener="#{scheduleController.onEventMove}" update="MYFORM" />
                        <p:ajax event="eventResize"
                            listener="#{scheduleController.onEventResize}" update="MYFORM" />

                    </p:schedule>

我能够在屏幕上看到事件的变化。