mcpField
S
syncfusion-angular-calendar

syncfusion-angular-calendar

github.com/syncfusion开发0127 次安装1 周前更新
代码仓库

关于 syncfusion-angular-calendar

面向 Angular 开发者的 Syncfusion Calendar 实现指南,涵盖日期选择、视图导航、事件处理与自定义。也介绍本地化、无障碍和状态持久化。

主要功能

  1. 01月、年和十年视图
  2. 02单日期与多日期选择
  3. 03导航方法与日历事件
  4. 04本地化及 RTL 支持
  5. 05键盘操作与无障碍功能
  6. 06样式自定义和状态持久化

适用场景

  1. 01在预订表单中选择日期并限制可选范围
  2. 02标记会议日期并按年或十年浏览
  3. 03为不同语言和 RTL 布局配置日期日历

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/syncfusion/angular-ui-components-skills --skill syncfusion-angular-calendar

安装后在 Claude Code 中输入/syncfusion-angular-calendar确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
accessibility-and-globalization.md
api-reference.md
calendar-navigation.md
calendar-views.md
date-selection.md
events-and-methods.md
getting-started.md
styling-and-customization.md

详细介绍

实现 Syncfusion Angular 日历

本指南全面介绍如何在 Angular 应用中实现 Syncfusion Essential JS 2 日历组件。了解如何创建日期选择器、管理日历视图、处理事件以及自定义样式。

日历概览

Syncfusion Angular 日历组件是一款日期选择控件,提供以下功能:

  • 多种日历视图: 月视图(默认)、年视图和十年视图,并支持流畅导航
  • 日期选择模式: 通过 isMultiSelection 属性选择单个日期或多个日期
  • 导航控制: 使用 navigateTo() 方法以编程方式切换视图
  • 日期操作方法: 使用 addDate() 和 removeDate() 管理多选
  • 全面的事件系统: change、created、navigated、renderDayCell、destroyed 事件
  • 本地化支持: 特定区域设置的格式、日期标题格式、一周的第一天
  • 无障碍功能: 完全符合 WCAG 2.2 标准,支持键盘导航和 RTL
  • 丰富的自定义选项: CSS 类、自定义渲染、日期单元格自定义
  • 状态持久化: 可选在页面重新加载后保留状态

软件包: @syncfusion/ej2-angular-calendars

文档导航

根据具体需求阅读以下参考文档:

入门指南

📄 阅读: references/getting-started.md

  • 软件包安装和模块设置
  • CSS 主题导入和依赖项
  • 基本日历实现
  • 在 Angular 中初始化组件
  • 运行和测试设置
日历视图

📄 阅读: references/calendar-views.md

  • 月视图(默认显示)
  • 年视图实现
  • 十年视图实现
  • 视图导航和切换
  • start 属性的用法
  • 用于限制视图的 depth 属性
日期选择

📄 阅读: references/date-selection.md

  • 单日期选择
  • 多日期选择(isMultiSelection)
  • 用于单个日期的 value 属性
  • 用于多个日期的 values 数组
  • 最小/最大日期限制
  • 日期范围验证
事件和方法

📄 阅读: references/events-and-methods.md

  • 事件处理程序(change、created、navigated、renderDayCell、destroyed)
  • 用于多选的 addDate() 方法
  • 用于多选的 removeDate() 方法
  • 用于编程式导航的 navigateTo()
  • 用于获取当前视图的 currentView()
  • 用于获取持久化数据的 getPersistData()
  • 用于销毁日历控件的 destroy()
  • 使用 RenderDayCell 自定义日期样式
日历导航

📄 阅读: references/calendar-navigation.md

  • 月份导航控件
  • 年视图和十年视图切换
  • “今天”按钮(showTodayButton)
  • firstDayOfWeek 属性
  • 周数显示(weekNumber)
  • 键盘快捷键和导航
无障碍功能和全球化

📄 阅读: references/accessibility-and-globalization.md

  • 符合 WCAG 2.2 和 Section 508 标准
  • WAI-ARIA 属性和角色
  • 键盘导航(方向键、回车键、空格键)
  • 屏幕阅读器兼容性
  • 本地化(locale 属性)
  • 日期标题格式(短、窄、缩写、宽)
  • RTL(从右到左)支持
样式和自定义

📄 阅读: references/styling-and-customization.md

  • CSS 类自定义(.e-calendar、.e-day-cell、.e-selected)
  • 主题选择(Material、Bootstrap、Tailwind、Fabric)
  • 深色模式实现
  • 通过 renderDayCell 自定义日期单元格样式
  • 禁用日期样式
  • 悬停和焦点状态
API 参考

📄 阅读: references/api-reference.md

  • 完整的属性参考(value、values、isMultiSelection、min、max、start、depth、showTodayButton、locale、dayHeaderFormat、weekNumber、weekRule、firstDayOfWeek、cssClass、enableRtl、enabled、calendarMode、keyConfigs、enablePersistence、serverTimezoneOffset)
  • 所有方法签名及示例(addDate、removeDate、navigateTo、currentView、getPersistData、destroy)
  • 事件参数类型(ChangedEventArgs、NavigatedEventArgs、RenderDayCellEventArgs)
  • 键盘快捷键配置
  • 日历模式(Gregorian、Islamic)
  • 返回类型和说明

快速入门示例

// app.component.ts
import { Component } from '@angular/core';
import { ChangedEventArgs } from '@syncfusion/ej2-calendars';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  // Single date selection
  selectedDate: Date = new Date();
  
  // Multiple date selection
  selectedDates: Date[] = [
    new Date(2026, 2, 15),
    new Date(2026, 2, 20),
    new Date(2026, 2, 25)
  ];
  
  // Calendar configuration
  minDate: Date = new Date(2020, 0, 1);
  maxDate: Date = new Date(2030, 11, 31);
  
  // Event handler
  onCalendarChange(args: ChangedEventArgs): void {
    console.log('Selected date:', args.value);
  }
}

<div style="padding: 20px; font-family: Arial, sans-serif;">
  <h2>Single Date Selection</h2>
  <ejs-calendar 
    [(ngModel)]="selectedDate"
    [min]="minDate"
    [max]="maxDate"
    (change)="onCalendarChange($event)">
  </ejs-calendar>
  <p>Selected: {{ selectedDate | date:'medium' }}</p>

  <h2>Multiple Date Selection</h2>
  <ejs-calendar 
    [(ngModel)]="selectedDates"
    [isMultiSelection]="true"
    [showTodayButton]="true">
  </ejs-calendar>
  <p>Selected dates: {{ selectedDates.length }} dates</p>
</div>
/* app.component.css */
@import '../node_modules/@syncfusion/ej2-base/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-calendars/styles/material3.css';

:host ::ng-deep .e-calendar {
  margin: 20px 0;
}

:host ::ng-deep .e-selected {
  background-color: #3f51b5;
  color: white;
}

常见模式

模式 1:自定义日期范围(两个日历实例)

Calendar 组件不内置范围选择功能。使用两个独立的 Calendar 实例,通过 min/max 约束和 change 事件实现自定义日期范围选择器:

export class AppComponent {
  startDate: Date = new Date();
  endDate: Date = new Date();
  
  onStartDateChange(args: ChangedEventArgs): void {
    this.startDate = args.value;
    // Ensure end date is not before start date
    if (this.endDate < this.startDate) {
      this.endDate = this.startDate;
    }
  }
  
  onEndDateChange(args: ChangedEventArgs): void {
    this.endDate = args.value;
  }
  
  getDaysInRange(): number {
    const timeDiff = this.endDate.getTime() - this.startDate.getTime();
    return Math.ceil(timeDiff / (1000 * 3600 * 24)) + 1;
  }
}

<ejs-calendar [(ngModel)]="startDate" (change)="onStartDateChange($event)"></ejs-calendar>
<ejs-calendar [(ngModel)]="endDate" [min]="startDate" (change)="onEndDateChange($event)"></ejs-calendar>

注意: 如需使用内置范围选择器,请改用 DateRangePicker 组件。

模式 2:禁用日期的日历

使用 renderDayCell 事件禁用特定日期(周末、节假日):

export class AppComponent {
  holidays: Date[] = [
    new Date(2026, 11, 25), // Christmas
    new Date(2026, 0, 1),   // New Year
  ];
  
  onRenderDayCell(args: RenderDayCellEventArgs): void {
    // Disable weekends
    if (args.date.getDay() === 0 || args.date.getDay() === 6) {
      args.isDisabled = true;
    }
    
    // Disable holidays
    if (this.isHoliday(args.date)) {
      args.isDisabled = true;
    }
  }
  
  private isHoliday(date: Date): boolean {
    return this.holidays.some(holiday => 
      holiday.toDateString() === date.toDateString()
    );
  }
}
模式 3:通过添加/移除进行多选

以编程方式管理多个选定日期:

export class AppComponent {
  @ViewChild('calendar') calendarRef!: CalendarComponent;
  selectedDates: Date[] = [];
  
  addDateToSelection(date: Date): void {
    // Check if already selected
    if (!this.selectedDates.some(d => 
        d.toDateString() === date.toDateString())) {
      this.calendarRef.addDate(date);
    }
  }
  
  removeDateFromSelection(date: Date): void {
    this.calendarRef.removeDate(date);
  }
  
  clearAllDates(): void {
    if (this.selectedDates.length > 0) {
      this.calendarRef.removeDate(this.selectedDates);
    }
  }
}
模式 4:年份/年代视图导航

实现导航到不同日历视图:

export class AppComponent {
  @ViewChild('calendar') calendarRef!: CalendarComponent;
  
  navigateToYear(year: number): void {
    const dateInYear = new Date(year, 0, 1);
    this.calendarRef.navigateTo('Year', dateInYear);
  }
  
  navigateToDecade(startYear: number): void {
    const dateInDecade = new Date(startYear, 0, 1);
    this.calendarRef.navigateTo('Decade', dateInDecade);
  }
  
  getCurrentView(): string {
    return this.calendarRef.currentView();
  }
}
模式 5:响应式表单集成

将 Calendar 与 Angular 响应式表单集成:

export class AppComponent implements OnInit {
  dateForm: FormGroup;
  
  constructor(private fb: FormBuilder) {
    this.dateForm = this.fb.group({
      eventDate: [new Date(), Validators.required],
      eventName: ['', Validators.required]
    });
  }
  
  ngOnInit(): void {
    // Subscribe to date changes
    this.dateForm.get('eventDate')?.valueChanges.subscribe(date => {
      console.log('Event date changed:', date);
    });
  }
  
  submitForm(): void {
    if (this.dateForm.valid) {
      console.log('Form values:', this.dateForm.value);
    }
  }
}
<form [formGroup]="dateForm" (ngSubmit)="submitForm()">
  <div>
    <label for="eventDate">Event Date:</label>
    <ejs-calendar 
      id="eventDate"
      formControlName="eventDate">
    </ejs-calendar>
  </div>
  
  <div>
    <label for="eventName">Event Name:</label>
    <input 
      id="eventName"
      type="text"
      formControlName="eventName">
  </div>
  
  <button type="submit" [disabled]="!dateForm.valid">Submit</button>
</form>

关键属性参考

属性类型描述示例
valueDate单个选定日期[value]="selectedDate"
valuesDate[]多个选定日期[values]="selectedDates"
isMultiSelectionboolean启用多日期选择[isMultiSelection]="true"
minDate可选日期的最早日期[min]="minDate"
maxDate可选日期的最晚日期[max]="maxDate"
startCalendarView初始视图(月/年/年代)start="Month"
depthCalendarView最大视图级别depth="Month"
showTodayButtonboolean显示“今天”按钮[showTodayButton]="true"
localestring区域设置/语言代码locale="fr-FR"
dayHeaderFormatDayHeaderFormats星期格式(短/窄/缩写/全称)dayHeaderFormat="Abbreviated"
weekNumberboolean显示周数[weekNumber]="true"
weekRuleWeekRule年首周规则(FirstDay/FirstFullWeek/FirstFourDayWeek)weekRule="FirstFourDayWeek"
firstDayOfWeeknumber一周的第一天(0=星期日,1=星期一)[firstDayOfWeek]="1"
cssClassstring自定义 CSS 类cssClass="custom-calendar"
enableRtlboolean启用 RTL 布局[enableRtl]="true"
enabledboolean启用/禁用组件[enabled]="true"
calendarModeCalendarType日历模式(Gregorian/Islamic)calendarMode="Islamic"
keyConfigs{ [key: string]: string }自定义键盘快捷键[keyConfigs]="keyConfigs"
enablePersistenceboolean在页面重新加载后保留状态[enablePersistence]="true"
serverTimezoneOffsetnumber | null用于处理初始日期的服务器时区偏移量[serverTimezoneOffset]="330"

常见用例

用例 1:活动预订系统

  • 用户为活动选择开始日期和结束日期
  • 禁用过去的日期和周末
  • 解决方案:结合使用最小/最大日期与 renderDayCell 实现禁用逻辑
  • 参考:日历视图 + 事件与方法

用例 2:会议日程

  • 显示多个高亮日期(会议日)
  • 支持按年/十年导航,方便规划
  • 解决方案:使用 isMultiSelection、高亮日期并在视图之间导航
  • 参考:日期选择 + 日历导航

用例 3:无障碍预订表单

  • 将日历集成到表单中,并支持键盘导航
  • 兼容屏幕阅读器,符合 WCAG 2.2
  • 解决方案:使用响应式表单 + 日历事件
  • 参考:无障碍与全球化

用例 4:国际化日期选择器

  • 支持多种语言和日期格式
  • 支持阿拉伯语、希伯来语的 RTL 显示
  • 解决方案:使用 locale 属性和本地化功能
  • 参考:无障碍与全球化

用例 5:动态日期限制

  • 根据业务逻辑(可用情况、节假日)禁用日期
  • 根据用户选择更新限制
  • 解决方案:结合动态逻辑使用 renderDayCell
  • 参考:事件与方法 + 日历视图

相关技能


**后续步骤:**根据具体需求选择上面的参考指南,或查看常见模式部分,找到适合用例的内容。

评论

支持 Markdown