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

Angular Material Autocomplete重复选中选项显示值异常问题

问题修复:Angular Material Autocomplete重复选中显示ID而非名称

问题原因

你的mat-option将[value]绑定到了option.id,输入框的[(ngModel)]却绑定到name字段。首次选中时,selectionChange事件会手动把name设为选项的名称;但重复选中同一选项时,Angular Material会直接将选项的value(也就是ID)赋值给ngModel绑定的name,导致显示内容变成ID。

修复方案(最小改动)

添加displayWith函数,明确告诉Autocomplete如何渲染选中选项的显示文本,替代默认的直接显示value的行为。

修改后的TS代码

import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
import {
  MatAutocompleteModule,
  MatAutocompleteSelectedEvent,
} from '@angular/material/autocomplete';
import { MatInputModule } from '@angular/material/input';

interface Item {
  id: string;
  name: string;
}

@Component({
  selector: 'app-autocomplete',
  standalone: true,
  templateUrl: './autocomplete.component.html',
  styleUrls: ['./autocomplete.component.css'],
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, FormsModule, MatAutocompleteModule, MatInputModule],
})
export class AutocompleteComponent {
  options: Item[] = [
    { id: '1', name: 'Item One' },
    { id: '2', name: 'Item Two' },
    { id: '3', name: 'Item Three' },
  ];
  name: string = '';
  id: string = '';
  placeholder: string = 'Select an option';

  resetField() {
    this.name = '';
  }

  selectionChange(e: MatAutocompleteSelectedEvent) {
    this.name = e.option.viewValue;
    this.id = e.option.value; // 保留ID赋值用于业务逻辑
  }

  // 新增:根据ID匹配对应的名称作为显示文本
  displayOption(id: string): string {
    const matchedItem = this.options.find(item => item.id === id);
    return matchedItem ? matchedItem.name : '';
  }
}

修改后的HTML代码

<mat-form-field>
  <mat-label>{{ placeholder }}</mat-label>
  <input
    #assetInput
    type="text"
    [placeholder]="placeholder"
    matInput
    [(ngModel)]="name"
    [matAutocomplete]="auto"
  />
  <mat-autocomplete
    #auto="matAutocomplete"
    (optionSelected)="selectionChange($event)"
    [displayWith]="displayOption" <!-- 添加displayWith绑定 -->
  >
    <mat-option *ngFor="let option of options" [value]="option.id">
      {{ option.name }}
    </mat-option>
  </mat-autocomplete>
</mat-form-field>

可选优化方案(绑定整个对象)

如果业务中需要同时处理ID和名称,可以将mat-option的[value]绑定到整个option对象,避免ID与名称分离绑定的混乱:

TS代码调整

// 替换原有的name和id字段
selectedItem: Item | null = null;

selectionChange(e: MatAutocompleteSelectedEvent) {
  this.selectedItem = e.option.value;
}

// 简化displayWith函数
displayOption(item: Item): string {
  return item ? item.name : '';
}

HTML代码调整

<input
  #assetInput
  type="text"
  [placeholder]="placeholder"
  matInput
  [(ngModel)]="selectedItem"
  [matAutocomplete]="auto"
/>
<mat-autocomplete
  #auto="matAutocomplete"
  (optionSelected)="selectionChange($event)"
  [displayWith]="displayOption"
>
  <mat-option *ngFor="let option of options" [value]="option">
    {{ option.name }}
  </mat-option>
</mat-autocomplete>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:01:19