实现 Angular 日历组件:如何拖动和创建事件?
Angular Calendar 是一个组件,它允许用户在日历中拖动和创建事件,还可以在月、周或日视图中显示事件。在本教程中,我们将学习如何实现具有拖动和创建事件功能的Angular Calendar 组件。
教程目标:实现 Angular 日历组件
在构建演示之前,让我们观看下面的视频,看看我们要构建什么。
创建 Angular CLI 项目
要安装 Angular CLI,请运行下面给出的命令:
运行以下命令来创建一个新的 Angular 项目:
安装角度日历
通过 npm 安装 angular-calendar & date-fns:
将 Angular 日历添加到您的应用程序
在项目的全局样式中导入CSS即源代码/styles.css.
在app.module.ts文件中导入 angular-calendar & date-fns,如下代码所示。
// 应用程序.module.ts
从'@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 {}
发展。优化。维护。Bacancy 的一切!
准备好减少你的挣扎!立即从 Bacancy聘请 Angular 开发人员,开始开发您梦想中的产品!我们在这里为您服务!
创建一个新组件
使用以下 TypeScript 代码:业务逻辑
// drag-comp.component.ts
从'@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
<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 Calendar的实现,让我们通过最后一步来完成该过程,以运行应用程序。
然后,在浏览器中打开以下 URL:http://localhost:4200
Github 存储库:Angular 日历源代码
您可以访问源代码并克隆 github 存储库以试用代码。
结论
所以这就是关于如何在 Angular 应用程序中实现 Angular 日历组件的全部内容。我希望现在您可以轻松地创建您的事件并使用该功能。Angular Calendar 组件确实提供了各种有用的功能,我们肯定也会讨论这些功能!想了解更多关于 Angular 的信息吗?访问Angular 教程页面!毫无疑问,您会喜欢我们团队为您精心准备的教程!如果您有任何建议/疑问/反馈,请联系我们。我们总是很高兴回答!
言鼎科技主做软件开发,微信小程序,网站开发,软件外包,手机APP开发。如有需要记得联系我们!