實(shí)現(xiàn) Angular 日歷組件:如何拖動(dòng)和創(chuàng)建事件?
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)行下面給出的命令:
運(yùn)行以下命令來(lái)創(chuàng)建一個(gè)新的 Angular 項(xiàng)目:
安裝角度日歷
通過(guò) npm 安裝 angular-calendar & date-fns:
將 Angular 日歷添加到您的應(yīng)用程序
在項(xiàng)目的全局樣式中導(dǎo)入CSS即源代碼/styles.css.
在app.module.ts文件中導(dǎo)入 angular-calendar & date-fns,如下代碼所示。
// 應(yīng)用程序.module.ts
從'@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 {}
發(fā)展。優(yōu)化。維護(hù)。Bacancy 的一切!
準(zhǔn)備好減少你的掙扎!立即從 Bacancy聘請(qǐng) Angular 開發(fā)人員,開始開發(fā)您夢(mèng)想中的產(chǎn)品!我們?cè)谶@里為您服務(wù)!
創(chuàng)建一個(gè)新組件
使用以下 TypeScript 代碼:業(yè)務(wù)邏輯
// drag-comp.component.ts
從'@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
<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)用程序
由于我們幾乎完成了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)系我們!