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

Angular 17与Angular Material 17.3.1:mat-form-field焦点/失焦事件异常

问题分析与解决方案

现有代码的问题

  1. 参数缺失导致逻辑错误:inActive()方法未声明$event参数,但内部却使用了该变量,触发blur事件时会因变量未定义导致isFieldFocused无法正确更新。
  2. 冗余逻辑:click()方法里的if ($event)判断完全多余,focus事件触发时必然会传入事件对象,直接赋值即可。

修正后的代码

HTML文件

<form class="example-form">
  <mat-form-field class="example-full-width" appearance="outline">
    <mat-label *ngIf="isFieldFocused">Selected Food</mat-label>
    <input
      matInput
      placeholder="Select Menu"
      (focus)="onFocus()"
      (blur)="onBlur()"
    />
  </mat-form-field>
</form>

TypeScript文件

export class InputOverviewExample {
  isFieldFocused: boolean = false;

  onFocus() {
    this.isFieldFocused = true;
  }

  onBlur() {
    this.isFieldFocused = false;
  }
}

更优雅的替代方案(利用Angular Material原生特性)

Angular Material的mat-form-field本身支持相关交互,无需手动监听focus/blur事件。如果要严格实现「初始显示placeholder,聚焦时显示label」的需求,可结合CSS控制:

优化代码

HTML文件

<form class="example-form">
  <mat-form-field class="example-full-width" appearance="outline">
    <mat-label>Selected Food</mat-label>
    <input
      matInput
      placeholder="Select Menu"
    />
  </mat-form-field>
</form>

全局/组件CSS

/* 初始状态隐藏label */
mat-form-field:not(.mat-focused) mat-label {
  display: none;
}
/* 聚焦时显示label */
mat-form-field.mat-focused mat-label {
  display: block;
}

这种方式无需在组件内维护状态变量,直接利用Angular Material内置的状态类实现效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:04:54