如何将关闭按钮添加到自定义 mat-datepicker-header
How to add close button to customized mat-datepicker-header
我正在使用 Angular material 中的这个 UI 组件。
https://material.angular.io/components/datepicker/overview#customizing-the-calendar-header
我想为自定义添加关闭按钮 header,但似乎还不可能。
至少我想从日期选择器 header 组件中获取输出事件。
由于 MatDatepicker
和 MatCalendarHeader
是两个独立的组件,您需要使用 EventEmitter
或 BehaviourSubject
在组件之间传递数据服务。
对于这个例子,我将使用一个服务。首先,您可以创建一个名为 calendar-service.ts
的服务,它将用于在组件之间共享数据。在此 class 中,我们将使用 BehaviourSubject 发出更新的布尔值,该值将指示日期选择器是否应该打开或关闭。
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable()
export class CalendarService {
closeCalendarSource = new BehaviorSubject<boolean>(false);
isCloseCalander = this.closeCalendarSource.asObservable();
constructor() { }
closeCalander(message: boolean) {
this.closeCalendarSource.next(message)
}
}
在您 MatCalendarHeader
的模板上,您应该添加一个绑定到点击事件的按钮,这将触发关闭日期选择器的操作
<button mat-icon-button (click)="closeCalendar()" >
<mat-icon>close</mat-icon>
</button>
并在 component.ts 上为 header、
constructor(
private calendarService: CalendarService) {
}
closeCalendar() {
this.calendarService.closeCalander(true);
}
在使用 MatDatepicker
的主要组件上,您将订阅将从 header 组件发出当前值的可观察对象。
@ViewChild('picker', { static: false}) picker;
exampleHeader = ExampleHeader;
constructor(private calendarService: CalendarService) {}
ngOnInit() {
this.calendarService.isCloseCalander.subscribe(isClose => {
if (isClose) {
this.picker.close();
}
});
}
我已经在 here 上创建了完整的演示。
我想你应该看看这个 example。你应该能够在没有 calendarService
的情况下让它工作。基本上你可以在构造函数中获取父日期选择器组件:
constructor(
private datePicker: MatDatepicker<D>,
private calendar: MatCalendar<D>,
private dateAdapter: DateAdapter<D>,
@Inject(MAT_DATE_FORMATS) private dateFormats: MatDateFormats,
cdr: ChangeDetectorRef,
) {
this.calendar.stateChanges.pipe(takeUntil(this.onDestroy$)).subscribe(() => cdr.markForCheck());
}
我将它与 HTML 中的今天按钮一起使用:
<button
mat-icon-button
class="todayButton"
(click)="todayClicked()"
matTooltip="Select today"
>
{{ today }}
</button>
然后调用该方法,this.datePicker.close()
将关闭日历弹出窗口:
todayClicked() {
this.calendar.activeDate = this.dateAdapter.today();
this.calendar._dateSelected(this.calendar.activeDate);
this.datePicker.select(this.dateAdapter.today());
this.datePicker.close();
}
感谢原作者:@tabuckner
遇到这个并认为我会分享我的发现。
根据此 github issue,添加了一个分支,以便您可以将该组件用作包装器,这样您将获得该组件的所有简洁功能。
要利用它,您的模板非常简单
<mat-calendar-header>
<button>TODAY</button>
</mat-calendar-header>
这是我的 stackblitz 的 link 示例:https://stackblitz.com/edit/mat-datepicker-today-button?file=src/main.ts
我正在使用 Angular material 中的这个 UI 组件。
https://material.angular.io/components/datepicker/overview#customizing-the-calendar-header
我想为自定义添加关闭按钮 header,但似乎还不可能。
至少我想从日期选择器 header 组件中获取输出事件。
由于 MatDatepicker
和 MatCalendarHeader
是两个独立的组件,您需要使用 EventEmitter
或 BehaviourSubject
在组件之间传递数据服务。
对于这个例子,我将使用一个服务。首先,您可以创建一个名为 calendar-service.ts
的服务,它将用于在组件之间共享数据。在此 class 中,我们将使用 BehaviourSubject 发出更新的布尔值,该值将指示日期选择器是否应该打开或关闭。
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable()
export class CalendarService {
closeCalendarSource = new BehaviorSubject<boolean>(false);
isCloseCalander = this.closeCalendarSource.asObservable();
constructor() { }
closeCalander(message: boolean) {
this.closeCalendarSource.next(message)
}
}
在您 MatCalendarHeader
的模板上,您应该添加一个绑定到点击事件的按钮,这将触发关闭日期选择器的操作
<button mat-icon-button (click)="closeCalendar()" >
<mat-icon>close</mat-icon>
</button>
并在 component.ts 上为 header、
constructor(
private calendarService: CalendarService) {
}
closeCalendar() {
this.calendarService.closeCalander(true);
}
在使用 MatDatepicker
的主要组件上,您将订阅将从 header 组件发出当前值的可观察对象。
@ViewChild('picker', { static: false}) picker;
exampleHeader = ExampleHeader;
constructor(private calendarService: CalendarService) {}
ngOnInit() {
this.calendarService.isCloseCalander.subscribe(isClose => {
if (isClose) {
this.picker.close();
}
});
}
我已经在 here 上创建了完整的演示。
我想你应该看看这个 example。你应该能够在没有 calendarService
的情况下让它工作。基本上你可以在构造函数中获取父日期选择器组件:
constructor(
private datePicker: MatDatepicker<D>,
private calendar: MatCalendar<D>,
private dateAdapter: DateAdapter<D>,
@Inject(MAT_DATE_FORMATS) private dateFormats: MatDateFormats,
cdr: ChangeDetectorRef,
) {
this.calendar.stateChanges.pipe(takeUntil(this.onDestroy$)).subscribe(() => cdr.markForCheck());
}
我将它与 HTML 中的今天按钮一起使用:
<button
mat-icon-button
class="todayButton"
(click)="todayClicked()"
matTooltip="Select today"
>
{{ today }}
</button>
然后调用该方法,this.datePicker.close()
将关闭日历弹出窗口:
todayClicked() {
this.calendar.activeDate = this.dateAdapter.today();
this.calendar._dateSelected(this.calendar.activeDate);
this.datePicker.select(this.dateAdapter.today());
this.datePicker.close();
}
感谢原作者:@tabuckner
遇到这个并认为我会分享我的发现。
根据此 github issue,添加了一个分支,以便您可以将该组件用作包装器,这样您将获得该组件的所有简洁功能。
要利用它,您的模板非常简单
<mat-calendar-header>
<button>TODAY</button>
</mat-calendar-header>
这是我的 stackblitz 的 link 示例:https://stackblitz.com/edit/mat-datepicker-today-button?file=src/main.ts