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

Angular Material Mat日期范围选择器Jalali适配器下setValue失效如何解决

问题核心原因

你自定义的JalaliMomentDateAdapter适配的是jMoment类型的日期对象,而你当前给表单setValue传入的是字符串格式的日期,适配器无法直接识别渲染,所以输入框显示为空。


解决步骤

1. 修改日期转换方法,返回jMoment实例而非字符串

你的convertToMiladi原有逻辑存在冗余错误,直接返回适配器可识别的jMoment对象即可:

import * as jMoment from 'moment-jalaali';

convertToMiladi(date: string): jMoment.Moment {
  // 若输入date为波斯历字符串,使用jMoment的波斯历格式解析
  return jMoment(date, 'jYYYY-jMM-jDD').locale('fa');
  // 若输入date为公历字符串,使用通用格式解析即可
  // return jMoment(date, 'YYYY-MM-DD').locale('fa');
}

2. 直接给表单传入jMoment实例赋值

if (filterModel.fromCreateDate && filterModel.toCreateDate) { 
  // 直接传入转换后的jMoment实例即可
  this.form.patchValue({
    fromDate: this.convertToMiladi(filterModel.fromCreateDate),
    toDate: this.convertToMiladi(filterModel.toCreateDate)
  })
}

3. 确认模块的适配器配置正确

在对应功能模块的providers中必须注册适配器和日期格式:

providers: [
  { provide: DateAdapter, useClass: JalaliMomentDateAdapter, deps: [MAT_DATE_LOCALE] },
  { provide: MAT_DATE_FORMATS, useValue: PERSIAN_DATE_FORMATS },
  { provide: MAT_DATE_LOCALE, useValue: 'fa-IR' }
]

补充注意

你当前适配器中的toIso8601和invalid方法为空实现,后续如果需要做表单校验、日期序列化功能,建议补充这两个方法的逻辑,避免出现额外异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:39:02