导读:本期聚焦于小伙伴创作的《Angular Formly自定义组件验证消息为什么不在失焦时显示及如何解决》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Angular Formly自定义组件验证消息为什么不在失焦时显示及如何解决》有用,将其分享出去将是对创作者最好的鼓励。

在Angular Formly中,使用自定义组件作为字段类型时,经常会发现验证错误信息没有在输入框失焦(blur)时立刻显示,而是直到提交或再次变更才出现。这会影响用户体验,也让表单校验看起来不可靠。本文分析产生该问题的原因,并给出可落地的解决方案。

Angular Formly自定义组件验证消息为什么不在失焦时显示及如何解决

问题产生的原因

Formly依赖Angular的AbstractControl状态来判断是否显示验证消息。对于原生控件,Angular会自动在blur时标记控件为touched。但自定义组件若未正确实现ControlValueAccessor的onTouched方法,Formly无法感知失焦动作,因此不会切换显示验证消息。

常见遗漏点

  • 自定义组件未注入并调用onTouched回调
  • formly字段配置缺少validation或messages定义
  • 未使用formly提供的FormlyFieldConfig来关联状态

解决方案

第一步:自定义组件实现onTouched

在自定义组件中,除了writeValue和registerOnChange,还必须实现registerOnTouched,并在宿主元素blur时调用它。

import <Component> from '@angular/core';
import <ControlValueAccessor, NG_VALUE_ACCESSOR> from '@angular/forms';

@Component({
  selector: 'app-custom-input',
  template: `<input (blur)="onBlur()" (input)="onInput($event)" [value]="value">`,
  providers: [
    { provide: NG_VALUE_ACCESSOR, useExisting: CustomInputComponent, multi: true }
  ]
})
export class CustomInputComponent implements ControlValueAccessor {
  value: string = '';
  onChange: (val: string) => void = () => {};
  onTouched: () => void = () => {};

  writeValue(val: string): void {
    this.value = val;
  }

  registerOnChange(fn: any): void {
    this.onChange = fn;
  }

  registerOnTouched(fn: any): void {
    this.onTouched = fn;
  }

  onInput(event: any): void {
    this.value = event.target.value;
    this.onChange(this.value);
  }

  onBlur(): void {
    // 关键:通知Formly控件已被触碰
    this.onTouched();
  }
}

第二步:配置Formly字段与验证消息

在formly配置中,需要为字段声明验证规则,并通过validation.messages定义对应文本。同时可借助expressionProperties控制显示时机。

import <FormlyFieldConfig> from '@ngx-formly/core';

const fields: FormlyFieldConfig[] = [
  {
    key: 'username',
    type: 'custom-input',
    templateOptions: {
      label: '用户名',
      required: true
    },
    validation: {
      messages: {
        required: '用户名不能为空'
      }
    }
  }
];

第三步:模板中启用错误展示

在表单模板里,通过formly提供的formly-field组件渲染,并确保外层form使用带updateOn或默认blur触发校验的设定。

<form [formGroup]="form">
  <formly-form [form]="form" [fields]="fields" [model]="model"></formly-form>
</form>

小结

Angular Formly自定义组件验证消息未在失焦时显示,核心在于自定义组件没有把blur状态同步给表单控件。只要正确实现registerOnTouched并在blur时调用,配合Formly的validation配置,就能让错误提示在失焦后正常出现。建议封装基础自定义组件时统一处理onTouched,避免重复踩坑。

Angular_Formly自定义组件验证消息修改时间:2026-07-30 04:24:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。