FullCalendar 的資源時間軸和依資源分欄的檢視屬於 Premium 版:商業應用程式必須付費購買授權金鑰。它的授權頁面列出了可免費使用的情況:整個應用程式都採用 AGPL,或是由已登記的非營利組織使用。Needless UI 行事曆以 MIT 授權同時提供這兩項功能,還支援週期性活動和 iCalendar 檔案。這份指南說明如何把 Angular 應用程式從前者遷移到後者:哪些可以直接沿用、哪些不行,以及哪些資料需要轉換。

本文使用 FullCalendar 7 的名稱;版本 6 的名稱與之不同時,會寫在方括號中。FullCalendar 的 Angular 連接器支援 Angular 16 到 22;Needless UI 則需要 Angular 22。

功能比較

FullCalendar 與 Needless UI 行事曆
功能FullCalendarNeedless 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 中的對應項目
FullCalendarNeedless UI 行事曆
<full-calendar [options]>、plugins、schedulerLicenseKey<nui-scheduler>,每個選項都有對應的輸入屬性;不需要外掛程式,也不需要金鑰
initialView: 'resourceTimelineDay'view="timeline",要顯示一週或一個月時再加上 timelineSpan
initialView: 'timeGridWeek'view="week";[(view)] 支援雙向繫結
resources、events[resources]、[events]
resourceId、extendedPropsresource、data
editable、selectableeditable、selectable
select(slotSelect):{ start, end, allDay, resource }
eventDrop、eventResize(eventChange):在你更新 events 之前,什麼都不會移動
eventClick(eventClick)
eventOverlap、selectOverlap、eventAllow[allow]:用一個函式統一處理移動、調整長度和選取
slotDuration、snapDurationslotMinutes、snapMinutes,以分鐘為單位
slotMinTime、slotMaxTime、scrollTimedayStart、dayEnd、scrollHour,以小時為單位
businessHours[businessHours],星期以 1(星期一)到 7 表示
datesSet(rangeChange)
eventContent、resourceCellContent [resourceLabelContent]nuiSchedulerEvent 和 nuiSchedulerResource 範本
locale、firstDaylocale(任何 BCP 47 語言標記)、firstDay(值為 1 到 7),以及用於介面文字的 labels

會議室預訂時間軸的兩種寫法

會議室是資源,預訂是活動。使用者在會議室的列上拖曳來預訂,拖曳預訂來移動它,而且一間會議室同一時間只能有一筆預訂。使用 FullCalendar 7 及其 Premium 資源時間軸:

使用 Needless UI 行事曆:

有兩點做法不同。FullCalendar 會自行移動預訂,再由應用程式同步這項變更;Needless UI 行事曆只會回報變更,你更新 events 後變更才會保留,因此你的資料始終是唯一的資料來源。此外,allow 就是一般的程式碼,不論變更來自指標還是鍵盤,每次變更前都會先詢問它,所以這條規則可以由你自己測試。會議室預約行事曆指南會一步步打造這個應用程式。

轉換資料

FullCalendar 的資料與行事曆要求的格式
FullCalendarNeedless UI
全天活動的 end 是活動結束後的那一天全天活動的 end 是它的最後一天:要減去一天
時間可能以 Z 或偏移量(例如 +02:00)結尾不含偏移量的本地時間,例如 2026-11-02T09:30
星期以 0(星期日)到 6 表示,用於 businessHours 和 firstDay星期以 1(星期一)到 7(星期日)表示
時間長度以字串表示,例如 '00:30'以數字表示:分鐘數或小時數
資源先依 id 排序,再依標題排序資源依陣列中的順序排列
物件形式的 rrule,以及 exruleRFC 5545 字串(例如 FREQ=WEEKLY;BYDAY=MO,FR),以及 exdate
時區,例如 America/New_York先換算時間。nuiSchedulerFromIcs(text, { timeZone }) 會在讀取 .ics 檔案時一併換算。

如果需要尚未支援的功能

如果你的應用程式依賴時區、資源分組、外部拖放或列印,這個行事曆目前還無法取代 FullCalendar。歡迎針對你需要的功能提出 issue。至於其他內容,行事曆頁面列出了每個輸入屬性、輸出屬性和範例。