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

Angular6 Material表单:输入框显示组合内容而非仅值的实现

用displayWith轻松实现需求

当然可以!你不需要修改表单的实际值,只靠Angular Material的displayWith属性就能搞定——它专门用来帮你分离输入框的显示文本和表单绑定的值,完美匹配你的场景。

第一步:给组件加个显示处理函数

先在你的组件.ts文件里加个小函数,作用是根据表单里的code值,返回你想要显示的完整文本:

displayFn(code: string): string {
  // 先从你的数据列表里找到对应code的条目
  // 如果你用了async管道,建议把list的数据存到一个本地数组里(比如listData),方便这里查找
  const matchedItem = this.listData.find(item => item.code === code);
  // 找到就返回拼接后的文本,没找到就显示原code
  return matchedItem ? `${matchedItem.code} - ${matchedItem.name}` : code;
}

小提示:因为你的list用了async管道,最好在组件里订阅这个Observable,把数据存到本地数组(比如listData),这样查找的时候更方便,不用每次都处理Observable。

第二步:修改模板绑定displayWith

然后把这个函数绑定到mat-autocomplete的displayWith属性上,原来的[value]="val.code"保持不变(这样表单值还是code):

<mat-form-field>
  <input matInput [matAutocomplete]="auto" [formControl]="autoForm" formControlName="formg">
  <mat-autocomplete #auto="matAutocomplete" panelWidth="200" [displayWith]="displayFn">
    <mat-option *ngFor="let val of list | async" [value]="val.code" (onSelectionChange)="changed($event)">
      <span>{{val.code}} - {{val.name}}</span>
    </mat-option>
  </mat-autocomplete>
</mat-form-field>

这样设置之后,选完选项输入框会显示xxx - 名称的格式,但表单里formg的值依然是原来的code,完全满足你的要求!

额外说明

  • displayWith就是干这个活的:让输入框显示友好的用户文本,同时表单里存的是业务需要的编码/ID,不用做任何值的转换。
  • 如果你纠结“能不能纯HTML实现”,其实严格来说不行——因为要根据code找到对应的name,必须有一点逻辑处理,但这个函数真的非常轻量,完全不会影响你的表单逻辑,算是最接近纯HTML的解决方案了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:18:13