实现 Angular 日历组件:如何拖动和创建事件?

言鼎科技 2023-06-23 463

Angular Calendar 是一个组件,它允许用户在日历中拖动和创建事件,还可以在月、周或日视图中显示事件。在本教程中,我们将学习如何实现具有拖动和创建事件功能的Angular Calendar 组件。

教程目标:实现 Angular 日历组件

在构建演示之前,让我们观看下面的视频,看看我们要构建什么。

创建 Angular CLI 项目

要安装 Angular CLI,请运行下面给出的命令:

实现 Angular 日历组件:如何拖动和创建事件?
npm 安装-g @angular/cli

运行以下命令来创建一个新的 Angular 项目:

实现 Angular 日历组件:如何拖动和创建事件?
ng 新的角度日历演示cd 角度日历演示

安装角度日历

通过 npm 安装 angular-calendar & date-fns:

实现 Angular 日历组件:如何拖动和创建事件?
npm 安装 angular-calendar date-fns

将 Angular 日历添加到您的应用程序

在项目的全局样式中导入CSS即源代码/styles.css.

实现 Angular 日历组件:如何拖动和创建事件?
@import "../node_modules/angular-calendar/css/angular-calendar.css";

在app.module.ts文件中导入 angular-calendar & date-fns,如下代码所示。

// 应用程序.module.ts

实现 Angular 日历组件:如何拖动和创建事件?
从'@angular/core'导入{NgModule};从'@angular/platform-browser'导入{BrowserModule};从'./app-routing.module'导入{AppRoutingModule};从 './app.component' 导入 { AppComponent };从 'angular-calendar' 导入 { CalendarModule, DateAdapter };从 'angular-calendar/date-adapters/date-fns' 导入 { adapterFactory };从'./view/drag-comp/drag-comp.component'导入{DragCompComponent};@NgModule({
 声明:[AppComponent, DragCompComponent],
 进口:[
   浏览器模块,
   应用路由模块,
   CalendarModule.forRoot({
     提供:日期适配器,
     使用工厂:适配器工厂,
   }),
 ],
 供应商:[],
 引导程序:[AppComponent],})导出类 AppModule {}

创建一个新组件

实现 Angular 日历组件:如何拖动和创建事件?
ng 生成组件 drag-comp

使用以下 TypeScript 代码:业务逻辑

// drag-comp.component.ts

实现 Angular 日历组件:如何拖动和创建事件?
从'@angular/core'导入{ChangeDetectorRef};进口 {
 变更检测策略,
 成分,
 启动时,
 查看封装,} 来自“@angular/core”;从 'angular-calendar' 导入 { CalendarEvent, CalendarEventTitleFormatter };从'calendar-utils'导入{WeekViewHourSegment};从'date-fns'导入{addDays,addMinutes,endOfWeek};从'rxjs'导入{fromEvent};从 'rxjs/operators' 导入 { finalize, takeUntil };函数 floorToNearest(数量:数字,精度:数字){
 返回 Math.floor(数量/精度)*精度;}函数 ceilToNearest(数量:数字,精度:数字){
 返回 Math.ceil(数量/精度)*精度;}@成分({
 选择器:'app-drag-comp',
 templateUrl: './drag-comp.component.html',
 styleUrls: ['./drag-comp.component.scss'],
 changeDetection:ChangeDetectionStrategy.OnPush,
 供应商:[
   {
     提供:CalendarEventTitleFormatter,
   },
 ],
 封装:ViewEncapsulation.None,})导出类 DragCompComponent 实现 OnInit {
 viewDate = new Date();
 weekStartsOn: 0 = 0;
 dragToCreateActive = false;
 事件:CalendarEvent[] = [];
 天数:任何[] = [];
 插槽:任何[] = [];
 构造函数(私有 cdr:ChangeDetectorRef){}
 ngOnInit(): void {
   这个.initDays();
 }
 初始化天数(){
   这天 = [
     '星期日',
     '周一',
     '周二',
     '周三',
     '周四',
     '星期五',
     '周六',
   ];
   for (let i = 0; i < this.days.length; i++) {
     让 a = { day: this.days[i], time: [] };
     this.slots.push(a);
   }
 }
 startDragToCreate(
   段:WeekViewHourSegment,
   mouseDownEvent: 鼠标事件,
   段元素:HTMLElement
 ) {
   const dragToSelectEvent: 日历事件 = {
     编号:this.events.length,
     title: '新插槽',
     开始:段.日期,
     元:{
       tmpEvent:真,
     },
     行动:[
       {
         标签: '',
         onClick: ({ event }: { event: CalendarEvent }): void => {
           this.events = this.events.filter((iEvent) => iEvent !== event);
           this.removeSlot(event.id);
         },
       },
     ],
   };
   this.events = [...this.events, dragToSelectEvent];
   const segmentPosition = segmentElement.getBoundingClientRect();
   this.dragToCreateActive = true;
   const endOfView = endOfWeek(this.viewDate, {
     weekStartsOn:this.weekStartsOn,
   });
   fromEvent(文档,'mousemove')
     。管道(
       完成(()=> {
         删除 dragToSelectEvent.meta.tmpEvent;
         this.dragToCreateActive = false;
         这个。刷新();
       }),
       takeUntil(fromEvent(文档,'mouseup'))
     )
     .subscribe((mouseMoveEvent: MouseEvent) => {
       常量 minutesDiff = ceilToNearest(
         mouseMoveEvent.clientY - segmentPosition.top,
         30
       );
       const daysDiff =
         floorToNearest(
           mouseMoveEvent.clientX - segmentPosition.left,
           段位置.宽度
         ) / segmentPosition.width;
       const newEnd = addDays(addMinutes(segment.date, minutesDiff), daysDiff);
       如果(newEnd > segment.date && newEnd < endOfView){
         dragToSelectEvent.end = newEnd;
       }
       这个。刷新();
     });
 }
 私人刷新(){
   this.events = [...this.events];
   this.cdr.detectChanges();
   this.getSlots();
 }
 转换时间(t){
   返回新日期(t).toTimeString();
 }
 转换日(d){
   返回新日期(d).toLocaleString('en-us',{
     工作日:“长”,
   });
 }
 getSlots() {
   this.slots.map((day, i) => {
     this.slots[i].time = [];
     this.events.forEach((e) => {
       如果(day.day == this.convertDay(e.start)){
         this.slots[i].time.push({
           开始时间:e.start,
           结束时间:e.end,
           id: e.id,
         });
       }
     });
   });
 }
 removeSlot(id) {
   for (let j = 0; j < this.slots.length; j++) {
     this.slots[j].time = this.slots[j].time.filter((t) => t.id !== id);
   }
 }}

使用以下 HTML 代码:用户界面

// drag-comp.component.html

实现 Angular 日历组件:如何拖动和创建事件?
<div 类="容器">
 <ng-模板#weekViewHourSegmentTemplate
    让段=“段”发泄
    让语言环境=“语言环境”
    let-segmentHeight="segmentHeight"
    let-isTimeLabel="isTimeLabel"
  >
   <div #segmentElement
      class="cal-hour-segment"
      [style.height.px]="segmentHeight"  
      [class.cal-hour-start]="segment.isStart"
      [class.cal-after-hour-start]="!segment.isStart"
      [ngClass]="segment.cssClass"
      (mousedown)="startDragToCreate(segment, $event, segmentElement)">
       <div class="cal-time" *ngIf="isTimeLabel">
           {{ 分段日期 | calendarDate:'weekViewHour':locale }}
       </div>
   </div></ng-模板></div><mwl-日历周视图
   [viewDate]="viewDate" [events]="事件"
   [hourSegmentTemplate]="weekViewHourSegmentTemplate"
   [weekStartsOn]="weekStartsOn"></mwl-日历周视图><小时><div>选定的广告位</div><pre>{{ 插槽 | JSON }}</pre>

运行应用程序

实现 Angular 日历组件:如何拖动和创建事件?
服务

由于我们几乎完成了Angular Calendar的实现,让我们通过最后一步来完成该过程,以运行应用程序。

然后,在浏览器中打开以下 URL:http://localhost:4200

Github 存储库:Angular 日历源代码

您可以访问源代码并克隆 github 存储库以试用代码。

结论

所以这就是关于如何在 Angular 应用程序中实现 Angular 日历组件的全部内容。我希望现在您可以轻松地创建您的事件并使用该功能。Angular Calendar 组件确实提供了各种有用的功能,我们肯定也会讨论这些功能!想了解更多关于 Angular 的信息吗?访问Angular 教程页面!毫无疑问,您会喜欢我们团队为您精心准备的教程!如果您有任何建议/疑问/反馈,请联系我们。我们总是很高兴回答!

言鼎科技主做软件开发,微信小程序,网站开发,软件外包,手机APP开发。如有需要记得联系我们!

The End