實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?

言鼎科技 2023-06-23 464

Angular Calendar 是一個(gè)組件,它允許用戶在日歷中拖動(dòng)和創(chuàng)建事件,還可以在月、周或日視圖中顯示事件。在本教程中,我們將學(xué)習(xí)如何實(shí)現(xiàn)具有拖動(dòng)和創(chuàng)建事件功能的Angular Calendar 組件。

教程目標(biāo):實(shí)現(xiàn) Angular 日歷組件

在構(gòu)建演示之前,讓我們觀看下面的視頻,看看我們要構(gòu)建什么。

創(chuàng)建 Angular CLI 項(xiàng)目

要安裝 Angular CLI,請(qǐng)運(yùn)行下面給出的命令:

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
npm 安裝-g @angular/cli

運(yùn)行以下命令來(lái)創(chuàng)建一個(gè)新的 Angular 項(xiàng)目:

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
ng 新的角度日歷演示cd 角度日歷演示

安裝角度日歷

通過(guò) npm 安裝 angular-calendar & date-fns:

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
npm 安裝 angular-calendar date-fns

將 Angular 日歷添加到您的應(yīng)用程序

在項(xiàng)目的全局樣式中導(dǎo)入CSS即源代碼/styles.css.

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
@import "../node_modules/angular-calendar/css/angular-calendar.css";

在app.module.ts文件中導(dǎo)入 angular-calendar & date-fns,如下代碼所示。

// 應(yīng)用程序.module.ts

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
從'@angular/core'導(dǎo)入{NgModule};從'@angular/platform-browser'導(dǎo)入{BrowserModule};從'./app-routing.module'導(dǎo)入{AppRoutingModule};從 './app.component' 導(dǎo)入 { AppComponent };從 'angular-calendar' 導(dǎo)入 { CalendarModule, DateAdapter };從 'angular-calendar/date-adapters/date-fns' 導(dǎo)入 { adapterFactory };從'./view/drag-comp/drag-comp.component'導(dǎo)入{DragCompComponent};@NgModule({
 聲明:[AppComponent, DragCompComponent],
 進(jìn)口:[
   瀏覽器模塊,
   應(yīng)用路由模塊,
   CalendarModule.forRoot({
     提供:日期適配器,
     使用工廠:適配器工廠,
   }),
 ],
 供應(yīng)商:[],
 引導(dǎo)程序:[AppComponent],})導(dǎo)出類 AppModule {}

創(chuàng)建一個(gè)新組件

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
ng 生成組件 drag-comp

使用以下 TypeScript 代碼:業(yè)務(wù)邏輯

// drag-comp.component.ts

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
從'@angular/core'導(dǎo)入{ChangeDetectorRef};進(jìn)口 {
 變更檢測(cè)策略,
 成分,
 啟動(dòng)時(shí),
 查看封裝,} 來(lái)自“@angular/core”;從 'angular-calendar' 導(dǎo)入 { CalendarEvent, CalendarEventTitleFormatter };從'calendar-utils'導(dǎo)入{WeekViewHourSegment};從'date-fns'導(dǎo)入{addDays,addMinutes,endOfWeek};從'rxjs'導(dǎo)入{fromEvent};從 'rxjs/operators' 導(dǎo)入 { finalize, takeUntil };函數(shù) floorToNearest(數(shù)量:數(shù)字,精度:數(shù)字){
 返回 Math.floor(數(shù)量/精度)*精度;}函數(shù) ceilToNearest(數(shù)量:數(shù)字,精度:數(shù)字){
 返回 Math.ceil(數(shù)量/精度)*精度;}@成分({
 選擇器:'app-drag-comp',
 templateUrl: './drag-comp.component.html',
 styleUrls: ['./drag-comp.component.scss'],
 changeDetection:ChangeDetectionStrategy.OnPush,
 供應(yīng)商:[
   {
     提供:CalendarEventTitleFormatter,
   },
 ],
 封裝:ViewEncapsulation.None,})導(dǎo)出類 DragCompComponent 實(shí)現(xiàn) OnInit {
 viewDate = new Date();
 weekStartsOn: 0 = 0;
 dragToCreateActive = false;
 事件:CalendarEvent[] = [];
 天數(shù):任何[] = [];
 插槽:任何[] = [];
 構(gòu)造函數(shù)(私有 cdr:ChangeDetectorRef){}
 ngOnInit(): void {
   這個(gè).initDays();
 }
 初始化天數(shù)(){
   這天 = [
     '星期日',
     '周一',
     '周二',
     '周三',
     '周四',
     '星期五',
     '周六',
   ];
   for (let i = 0; i < this.days.length; i++) {
     讓 a = { day: this.days[i], time: [] };
     this.slots.push(a);
   }
 }
 startDragToCreate(
   段:WeekViewHourSegment,
   mouseDownEvent: 鼠標(biāo)事件,
   段元素:HTMLElement
 ) {
   const dragToSelectEvent: 日歷事件 = {
     編號(hào):this.events.length,
     title: '新插槽',
     開始:段.日期,
     元:{
       tmpEvent:真,
     },
     行動(dòng):[
       {
         標(biāo)簽: '',
         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;
         這個(gè)。刷新();
       }),
       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;
       }
       這個(gè)。刷新();
     });
 }
 私人刷新(){
   this.events = [...this.events];
   this.cdr.detectChanges();
   this.getSlots();
 }
 轉(zhuǎn)換時(shí)間(t){
   返回新日期(t).toTimeString();
 }
 轉(zhuǎn)換日(d){
   返回新日期(d).toLocaleString('en-us',{
     工作日:“長(zhǎng)”,
   });
 }
 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({
           開始時(shí)間:e.start,
           結(jié)束時(shí)間: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

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
<div 類="容器">
 <ng-模板#weekViewHourSegmentTemplate
    讓段=“段”發(fā)泄
    讓語(yǔ)言環(huán)境=“語(yǔ)言環(huán)境”
    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-日歷周視圖><小時(shí)><div>選定的廣告位</div><pre>{{ 插槽 | JSON }}</pre>

運(yùn)行應(yīng)用程序

實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
服務(wù)

由于我們幾乎完成了Angular Calendar的實(shí)現(xiàn),讓我們通過(guò)最后一步來(lái)完成該過(guò)程,以運(yùn)行應(yīng)用程序。

然后,在瀏覽器中打開以下 URL:http://localhost:4200

Github 存儲(chǔ)庫(kù):Angular 日歷源代碼

您可以訪問(wèn)源代碼并克隆 github 存儲(chǔ)庫(kù)以試用代碼。

結(jié)論

所以這就是關(guān)于如何在 Angular 應(yīng)用程序中實(shí)現(xiàn) Angular 日歷組件的全部?jī)?nèi)容。我希望現(xiàn)在您可以輕松地創(chuàng)建您的事件并使用該功能。Angular Calendar 組件確實(shí)提供了各種有用的功能,我們肯定也會(huì)討論這些功能!想了解更多關(guān)于 Angular 的信息嗎?訪問(wèn)Angular 教程頁(yè)面!毫無(wú)疑問(wèn),您會(huì)喜歡我們團(tuán)隊(duì)為您精心準(zhǔn)備的教程!如果您有任何建議/疑問(wèn)/反饋,請(qǐng)聯(lián)系我們。我們總是很高興回答!

言鼎科技主做軟件開發(fā),微信小程序,網(wǎng)站開發(fā),軟件外包,手機(jī)APP開發(fā)。如有需要記得聯(lián)系我們!

The End