You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mat-calendar首次点击日期返回undefined,点击后如何关闭组件

mat-calendar使用问题解决方案

问题1:首次点击日期返回undefined,第二次点击正常

问题原因

你将selectedChange事件的订阅逻辑写在了click事件的回调函数内,首次触发点击时才刚刚完成订阅,无法捕获本次点击触发的selectedChange事件返回值,所以首次打印为undefined。且该写法会导致每次点击都新增一个订阅,存在内存泄漏风险。

解决方案

直接在模板中绑定selectedChange事件替代click事件,不需要手动订阅。
修正后代码如下:
file.html

<mat-calendar (selectedChange)="onSelectDate($event)" #picker></mat-calendar>

file.ts

public onSelectDate(selectedDate: Date | null): void {
    console.log(selectedDate);
    // 此处添加你的业务逻辑
}

修改后首次点击就能正常获取选中的日期值。

问题2:点击日期后关闭mat-calendar组件

根据你的使用场景有两种实现方案:

  • 如果你是搭配mat-datepicker使用mat-calendar,直接调用datepicker实例的close()方法即可:
    示例代码:
    <input matInput [matDatepicker]="picker">
    <mat-datepicker #picker>
      <mat-calendar (selectedChange)="onSelectDate($event, picker)"></mat-calendar>
    </mat-datepicker>
    
    import { MatDatepicker } from '@angular/material/datepicker';
    
    public onSelectDate(selectedDate: Date | null, picker: MatDatepicker<Date>): void {
      console.log(selectedDate);
      picker.close();
    }
    
  • 如果你是单独使用mat-calendar组件,通过布尔变量控制组件的显示隐藏即可:
    示例代码:
    <button (click)="showCalendar = true">打开日期选择器</button>
    <mat-calendar *ngIf="showCalendar" (selectedChange)="onSelectDate($event)"></mat-calendar>
    
    public showCalendar = false;
    
    public onSelectDate(selectedDate: Date | null): void {
      console.log(selectedDate);
      this.showCalendar = false;
    }
    

内容的提问来源于stack exchange,提问作者Yurii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 09:54:04