igx-grid自定义模板实现日期列内联编辑时出现toLocaleDateString不存在的错误
igx-grid日期列内联编辑触发
value.toLocaleDateString is not a function报错的解决方案 报错根因
这个类型错误的触发逻辑非常直接:igx-grid的日期列在执行内联编辑的初始化、值校验流程时,会默认期望单元格的当前值为原生Date实例;如果传入的值是字符串、数字时间戳等非Date类型,内部直接调用toLocaleDateString方法时,就会抛出该方法不存在的类型异常。即便自定义模板能正常唤起日历控件,只要值类型不匹配,整个编辑流程就会在初始化环节被中断。
现有实现的问题点
对照贴出的自定义列代码,两个问题会直接触发上述报错:
- 数据源返回的日期值没有做统一类型转换,接口返回的日期如果是字符串格式,直接传入单元格渲染、编辑链路时,无法被识别为合法Date类型
- 自定义编辑器的双向绑定逻辑存在冗余:
[(ngModel)]="cell.editValue ? cell.editValue : cell.value"的三元判断,在首次进入编辑态时会优先取未做类型处理的原始cell.value,绕过了igx-grid内部对编辑值的类型校验兜底
修正实现步骤
- 在组件类中新增日期类型兜底方法,对所有传入单元格的原始日期值做统一转换,从根源上避免非Date类型进入编辑链路:
// 兼容字符串、时间戳格式的输入,统一转成合法Date实例 toDate(value: any): Date | null { if (!value) return null; if (value instanceof Date) return value; const parsedDate = new Date(value); return isNaN(parsedDate.getTime()) ? null : parsedDate; } - 调整单元格渲染模板,保证展示层传入的值经过类型转换,和编辑层的取值类型完全一致:
<ng-template #cellTemplate igxCell *ngSwitchCase="'date'" let-cell="cell" let-value> {{ dateColumn(toDate(value), column.format) }} </ng-template> - 简化自定义日期编辑器的绑定逻辑,去掉冗余的三元判断,直接绑定grid编辑机制提供的
cell.editValue,避免取到未转换的原始值:<ng-template igxCellEditor *ngSwitchCase="'date'" let-cell="cell"> <igx-date-picker [(ngModel)]="cell.editValue" mode="dropdown" [igxFocus]="true" [labelVisibility]="false" mask="dd/MM/yyyy" format="dd/MM/yyyy" [value]="toDate(cell.value)"> </igx-date-picker> </ng-template>
注意事项
igx-date-picker的value属性强依赖Date类型实例,直接传入字符串格式的日期值,会直接破坏igx-grid编辑流程的类型校验- 如果后端返回的日期格式不是原生Date可直接解析的标准格式(比如自定义分隔符的非ISO格式),需要在
toDate方法中补充对应格式的解析逻辑,保证最终输出的是合法Date实例,再传入编辑链路。
内容的提问来源于stack exchange,提问作者wil
相关产品推荐
相关产品推荐

