最近在使用jQuery插件FullCalendar實現一個患者預約醫生看病的功能,大致需求如下:
1、 醫生首先以周爲單位設置自己下個月的出診時間,包括上班時間,下班時間,每次可預約的時間間隔
2、 患者通過在線預約系統,選擇醫生的出診時間並預約
3、 醫生可查看自己的預約安排,瞭解病人的預約情況,使用FullCalendar插件實現效果如下圖:
那麼現在問題來了,如果醫生不同的周或不同月上下班的時間不一樣,我們跳轉到別的周後,左邊的時間軸是否也要跟着改變,遺憾的是FullCalendar 沒有提供這個功能,除非你調用destroy方法,然後重新初始化calendar:
$('#mycalendar').fullCalendar('destroy');
$('#mycalendar').fullCalendar(calendarOptions);
但是,這樣做的結果是日曆記錄的信息都會初始化,也就是默認時間又會從當前周開始,這樣你就永遠沒法跳轉到下一週去。
此時想起插件本身是支持在'month,agendaWeek,agendaDay' 幾種視圖之間切換的,而且在視圖切換的過程中不會丟失保存的信息,由於需求不需要,我把切換視圖的功能給隱藏了,那麼我是否可以模擬一種視圖的切換呢,即把日期的跳轉看做是從agendaWeek 視圖切換到agendaWeek視圖。
通過查看FullCalendar的源碼,並參考網友的意見,發現這一思路是可行的,通過修改FullCalendar源碼的以下幾處地方,完美實現了需求。記錄如下:
1. 模擬插件自帶的t.changeView=changeView;
新增一個refreshView方法,
首先,增加一行:
't.refreshView = refreshView;'
2.
實現refreshView方法:模擬changeView方法調用_changeView(newView),只是把newView指定爲當前的view類型,新增如下:
function refreshView()
{
_changeView(currentView.name);
}
3.通過option()方法傳入參數,然後調用refreshView方法,修改option方法如下:
function option(name,value) {
if (value=== undefined) {
returnoptions[name];
}
if (name== 'height' || name == 'contentHeight' || name == 'aspectRatio') {
options[name]= value;
updateSize();
}
// -------------add by rcm on 2015/1/21 begin------
if (name== 'slotDuration' || name == 'minTime' || name == 'maxTime')
{
options[name]= value;
refreshView();
}
// -------------add by rcm on 2015/1/21 end------
}
ok,此時在
events: function(start, end,timezone, callback) {
可以如下調用:
$calendar.fullCalendar('option', 'minTime',data.beginBusiness);
$calendar.fullCalendar('option', 'maxTime',data.endBusiness);
$calendar.fullCalendar('option', 'slotDuration',data.slotDuration);
}
本人使用的FullCalendar版本是:FullCalendar v2.0.0
其他版本請自行研究,供參考,希望可以幫到你!