0Pricing
Angular Academy · 课时

处理禁用和已触碰状态

在控件中反映表单状态

处理禁用和已触碰状态 是 CoddyKit 上的免费 Angular Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Angular Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Angular Academy 课程共包含 4 节课。

不止是值

一个完整的自定义控件还需要正确处理表单的另外两个概念:禁用状态和已接触状态。它们会影响用户体验和验证信息的显示。

setDisabledState

当表单控件被禁用或启用时,Angular 会调用 setDisabledState(例如通过 control.disable())。请在您的组件中反映这一状态。

disabled = false;

setDisabledState(isDisabled: boolean): void {
  this.disabled = isDisabled;
}

在视图中反映禁用状态

使用 disabled 标志设置控件样式并阻止交互,使用户无法更改已禁用的字段。

template: '<button [disabled]="disabled" (click)="select(s)">star</button>'

保护处理程序

还要保护您的更改处理程序,使控件处于禁用状态时,程序操作或键盘交互都不会产生任何作用。

select(rating: number): void {
  if (this.disabled) return;
  this.value = rating;
  this.onChange(rating);
}

registerOnTouched

Angular 会传入一个用于将控件标记为已接触的回调。请像保存 onChange 一样保存它。

private onTouched: () => void = () => {};

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

调用 onTouched

当用户离开控件时调用已接触回调,通常是在失去焦点时调用。这样会告诉 Angular 用户已经与控件交互,从而启用基于已接触状态的验证消息。

onBlur(): void {
  this.onTouched();
}

为什么已接触状态很重要

验证用户体验通常只会在字段被接触后显示错误。如果不调用 onTouched,control.touched 会一直为 false,错误消息可能无法在适当的时机显示。

<small *ngIf="control.touched && control.invalid">Required</small>

连接失去焦点事件

在模板中连接失去焦点处理程序,使用户离开控件时将其标记为已接触。

template: '<div (blur)="onBlur()" tabindex="0">...</div>'

响应式禁用模式

请优先通过表单 API(control.disable())禁用控件,而不是使用模板中的 disabled 绑定,这样 Angular 就能一致地驱动 setDisabledState。

this.form.get('stars')?.disable();

无障碍支持

以符合无障碍要求的方式反映禁用和焦点状态:设置 aria-disabled、管理 tabindex,并确保键盘用户可以通过失去焦点来触发已接触状态,让所有用户都能使用该控件。

现在已完成集成

值、禁用状态和已接触状态都处理好后,您的控件在响应式表单和模板驱动表单中的行为就会像原生输入控件一样。最后还需要添加验证。

快速检查

检查您对禁用状态和已接触状态的掌握情况。

回顾

您处理了 setDisabledState(反映禁用状态并防止交互)和 registerOnTouched(在失去焦点时调用,以标记为已接触并启用验证用户体验)。请优先使用表单 API 驱动禁用状态,并确保控件符合无障碍要求。

常见问题解答

「处理禁用和已触碰状态」课时是免费的吗?

是的 — 「处理禁用和已触碰状态」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Angular Academy 课程的其余内容,请升级到 CoddyKit PRO。 Angular Academy 课程共包含 4 节课。

「处理禁用和已触碰状态」这节课中我会学到什么?

在控件中反映表单状态 你通过在浏览器中直接运行的动手代码来练习 Angular Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Angular Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Angular Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「处理禁用和已触碰状态」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Angular Academy 课中编写并运行代码吗?

能。每节 Angular Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. ControlValueAccessor 接口
  2. 编写和注册值
  3. 处理禁用和已触碰状态
  4. 自定义控件中的验证
← 返回 Angular Academy