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

如何解决Angular Material日期选择器异步加载禁用日期失效问题

解决Mat-Datepicker异步加载过滤日期失效问题

方案1:初始禁用日期选择器,数据加载完成后启用

通过初始禁用输入框,确保用户只能在假日数据加载完成后选择日期,从根源避免过滤逻辑失效。

修改HTML,添加禁用状态绑定:

<mat-form-field class="w-100">
  <input matInput 
         [matDatepicker]="picker" 
         formControlName="startDate" 
         [matDatepickerFilter]="myHolidayFilter" 
         placeholder="Choose a date"
         [disabled]="!myHolidayDates.length">
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>

组件TS代码初始化空数组,并在数据加载完成后更新:

myHolidayDates: Date[] = [];

ngOnInit() {
  this.scheduleService.getLeaveDate().subscribe(result => {
    this.myHolidayDates = result;
    // 可选:手动启用表单控件(若表单初始设置了禁用)
    // this.yourFormGroup.get('startDate')?.enable();
  });
}

myHolidayFilter = (d: Date) => {
  const time = d.getTime();
  return !this.myHolidayDates.find(x => x.getTime() === time);
};

方案2:将过滤器改为Getter函数,触发自动变更检测

把过滤器改成Getter函数,每次myHolidayDates更新时,Getter会返回新的函数引用,触发Angular重新应用过滤逻辑。

组件TS代码修改:

myHolidayDates: Date[] = [];

// 改为Getter函数
get myHolidayFilter() {
  return (d: Date) => {
    const time = d.getTime();
    return !this.myHolidayDates.find(x => x.getTime() === time);
  };
}

ngOnInit() {
  this.scheduleService.getLeaveDate().subscribe(result => {
    this.myHolidayDates = result;
  });
}

HTML无需修改,保持原有的[matDatepickerFilter]="myHolidayFilter"绑定即可。

方案3:手动触发日期选择器刷新(依赖内部API,谨慎使用)

数据加载完成后,手动调用日期选择器的内部刷新方法,强制重新渲染日历。

组件TS代码:

import { ViewChild } from '@angular/core';
import { MatDatepicker } from '@angular/material/datepicker';

// 获取日期选择器引用
@ViewChild('picker') picker!: MatDatepicker<Date>;

myHolidayDates: Date[] = [];
myHolidayFilter = (d: Date) => {
  const time = d.getTime();
  return !this.myHolidayDates.find(x => x.getTime() === time);
};

ngOnInit() {
  this.scheduleService.getLeaveDate().subscribe(result => {
    this.myHolidayDates = result;
    // 异步刷新日历,确保DOM已更新
    setTimeout(() => {
      if (this.picker) {
        this.picker._refreshHeader();
        this.picker._updateCalendar();
      }
    });
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:09:25