FullCalendar 的資源時間軸和依資源分欄的檢視屬於 Premium 版:商業應用程式必須付費購買授權金鑰。它的授權頁面列出了可免費使用的情況:整個應用程式都採用 AGPL,或是由已登記的非營利組織使用。Needless UI 行事曆以 MIT 授權同時提供這兩項功能,還支援週期性活動和 iCalendar 檔案。這份指南說明如何把 Angular 應用程式從前者遷移到後者:哪些可以直接沿用、哪些不行,以及哪些資料需要轉換。
本文使用 FullCalendar 7 的名稱;版本 6 的名稱與之不同時,會寫在方括號中。FullCalendar 的 Angular 連接器支援 Angular 16 到 22;Needless UI 則需要 Angular 22。
功能比較
| 功能 | FullCalendar | Needless UI |
|---|---|---|
| 資源時間軸:每間會議室或每位人員各佔一列 | Premium | 支援:一天、一週或一個月 |
| 日檢視和週檢視中依資源分欄 | Premium | 支援 |
| 月、週、日檢視 | 免費 | 支援 |
| 拖曳來移動活動或調整時間長度 | 免費;拖到另一個資源上需要 Premium | 支援,也能拖到其他資源上。可以拖曳結束端調整長度,開始端則不行。 |
| 選取時間來建立活動 | 免費 | 支援,可用指標、長按或鍵盤 |
| 規則,例如不允許重疊 | 免費:overlap 和 constraint 選項 | 支援:只要一個 allow 函式,每次變更前都會先詢問它 |
| 用鍵盤移動活動、調整時間長度 | 其無障礙文件中沒有提到;文件只涵蓋 ARIA 標籤和 Tab 焦點 | 支援,並會由螢幕閱讀器朗讀 |
| 週期性活動 | 免費,需搭配 rrule 外掛程式和函式庫 | 內建:RFC 5545 規則,但不支援 EXRULE、RDATE 和以小時為單位重複的規則 |
| iCalendar(.ics) | 免費:可讀取訂閱來源 | 可讀寫 .ics 檔案 |
| 列表檢視和年檢視 | 免費 | 提供未來幾天的活動列表;沒有年檢視 |
| 時區 | 免費:本地時區、UTC 或具名時區 | 不支援:依收到的時間原樣顯示 |
| 分組、巢狀或多欄的資源 | Premium | 不支援:只有一欄,由你的範本繪製 |
| 外部拖放、背景活動 | 免費 | 不支援 |
| 列印、虛擬渲染 | Premium | 不支援 |
| 框架 | Angular 16 到 22、React、Vue、純 JavaScript 等 | Angular 22 和 React 19 |
選項對照
| FullCalendar | Needless UI 行事曆 |
|---|---|
<full-calendar [options]>、plugins、schedulerLicenseKey | <nui-scheduler>,每個選項都有對應的輸入屬性;不需要外掛程式,也不需要金鑰 |
initialView: 'resourceTimelineDay' | view="timeline",要顯示一週或一個月時再加上 timelineSpan |
initialView: 'timeGridWeek' | view="week";[(view)] 支援雙向繫結 |
resources、events | [resources]、[events] |
resourceId、extendedProps | resource、data |
editable、selectable | editable、selectable |
select | (slotSelect):{ start, end, allDay, resource } |
eventDrop、eventResize | (eventChange):在你更新 events 之前,什麼都不會移動 |
eventClick | (eventClick) |
eventOverlap、selectOverlap、eventAllow | [allow]:用一個函式統一處理移動、調整長度和選取 |
slotDuration、snapDuration | slotMinutes、snapMinutes,以分鐘為單位 |
slotMinTime、slotMaxTime、scrollTime | dayStart、dayEnd、scrollHour,以小時為單位 |
businessHours | [businessHours],星期以 1(星期一)到 7 表示 |
datesSet | (rangeChange) |
eventContent、resourceCellContent [resourceLabelContent] | nuiSchedulerEvent 和 nuiSchedulerResource 範本 |
locale、firstDay | locale(任何 BCP 47 語言標記)、firstDay(值為 1 到 7),以及用於介面文字的 labels |
會議室預訂時間軸的兩種寫法
會議室是資源,預訂是活動。使用者在會議室的列上拖曳來預訂,拖曳預訂來移動它,而且一間會議室同一時間只能有一筆預訂。使用 FullCalendar 7 及其 Premium 資源時間軸:
使用 Needless UI 行事曆:
有兩點做法不同。FullCalendar 會自行移動預訂,再由應用程式同步這項變更;Needless UI 行事曆只會回報變更,你更新 events 後變更才會保留,因此你的資料始終是唯一的資料來源。此外,allow 就是一般的程式碼,不論變更來自指標還是鍵盤,每次變更前都會先詢問它,所以這條規則可以由你自己測試。會議室預約行事曆指南會一步步打造這個應用程式。
轉換資料
| FullCalendar | Needless UI |
|---|---|
全天活動的 end 是活動結束後的那一天 | 全天活動的 end 是它的最後一天:要減去一天 |
時間可能以 Z 或偏移量(例如 +02:00)結尾 | 不含偏移量的本地時間,例如 2026-11-02T09:30 |
星期以 0(星期日)到 6 表示,用於 businessHours 和 firstDay | 星期以 1(星期一)到 7(星期日)表示 |
時間長度以字串表示,例如 '00:30' | 以數字表示:分鐘數或小時數 |
| 資源先依 id 排序,再依標題排序 | 資源依陣列中的順序排列 |
物件形式的 rrule,以及 exrule | RFC 5545 字串(例如 FREQ=WEEKLY;BYDAY=MO,FR),以及 exdate |
時區,例如 America/New_York | 先換算時間。nuiSchedulerFromIcs(text, { timeZone }) 會在讀取 .ics 檔案時一併換算。 |
如果需要尚未支援的功能
如果你的應用程式依賴時區、資源分組、外部拖放或列印,這個行事曆目前還無法取代 FullCalendar。歡迎針對你需要的功能提出 issue。至於其他內容,行事曆頁面列出了每個輸入屬性、輸出屬性和範例。