Angular 5 Angular Material 2 - 使用 minLength 自动完成

Posted

技术标签:

【中文标题】Angular 5 Angular Material 2 - 使用 minLength 自动完成【英文标题】:Angular 5 Angular Material 2 - autocomplete with minLength 【发布时间】:2018-10-19 17:03:41 【问题描述】:

我在表单上添加了自动完成字段以选择患者。 患者数据来自数据库。问题是有 40.000 名患者

所以我想在用户输入最少 3 个字符后加载数据。 但我不知道如何检查以及如何将输入传递给函数(过滤器参数)。 这就是我所做的。当我点击输入字段时加载数据的那一刻:

html

<mat-form-field class="index-full-width">
                    <input
                      matInput
                      type="text"
                      [(ngModel)]="patientChoice"
                      placeholder="Patient"
                      aria-label="Patient"
                      [matAutocomplete]="autoPatient"
                      [formControl]="myControl"
                      (click)="getPatients()">
                    <mat-autocomplete (optionSelected)="selectPat()" #autoPatient="matAutocomplete" [displayWith]="displayFnPat">

                      <mat-option *ngFor="let patient of filteredPatients | async" [value]="patient">
                        <span> patient.lastName </span>
                        <small>patient.firstName</small> |
                        <span>né(e) le  patient.dateNaissance </span> |
                        <small>IPP: patient.ipp</small>
                      </mat-option>
                    </mat-autocomplete>
                  </mat-form-field>

TS:

 getPatients() 
let searchTerm = '*';
let success: any = ;
this.klinckServices.getPatients(searchTerm)
  .then((webScriptdata) => 
      success = webScriptdata;
      this.listPatients = success.data.items ;
      console.log(this.listPatients);
    ,
    msg => 
      alert(msg);
    );

 ngOnInit() 
this.filteredPatients = this.myControl.valueChanges.pipe(
  startWith<string | Patient>(''),
  map(patient => typeof patient === 'string' ? patient : patient.name),
  map(name => name ? this.filterPatient(name) : this.listPatients.slice())
);

 
  displayFnPat(patient: Patient): string | undefined 
return patient ? patient.name : undefined;
 


 filterPatient(name: string) 
   return this.listPatients.filter(patient =>
    patient.name.toLowerCase().includes(name.toLowerCase()));
 

【问题讨论】:

【参考方案1】:

还有另一种方法,推荐here。

它基本上是检查你的 filter 方法的长度。

  filterPatient(name: string) 
    if (name.length < 2) 
      return [];
    

    return this.listPatients.filter(patient =>
      patient.name.toLowerCase().includes(name.toLowerCase()));
  

【讨论】:

此方法是否适用于 switchMap?在处理 switchMap 的地图答案时,我发现它具有挑战性。【参考方案2】:

好的,通过添加 HTML (keyup)="getPatients($event)" 解决:

<input
    matInput
    type="text"
    [(ngModel)]="patientChoice"
    placeholder="Patient"
    aria-label="Patient"
    [matAutocomplete]="autoPatient"
    [formControl]="myControl"
    (keyup)="getPatients($event)"
 >

在 TS 文件中:

getPatients(event: any) 
let searchTerm = '';
searchTerm += event.target.value;
console.log(searchTerm);
if (searchTerm.length === 2) 
  let success: any = ;
  this.klinckServices.getPatients(searchTerm)
    .then((webScriptdata) => 
        success = webScriptdata;
        this.listPatients = success.data.items;
        console.log(this.listPatients);
      ,
      msg => 
        alert(msg);
      );

【讨论】:

以上是关于Angular 5 Angular Material 2 - 使用 minLength 自动完成的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Angular 4 更新/升级到 Angular 5+

@angular/cdk@5.0.3 需要 @angular/common@~5.1.1 的对等体,但没有安装

升级 Angular 版本 5

将 Angular 5 迁移到 Angular 7

将 Angular 2/3/4/5/6 项目转换为 Angular Universal

Angular 5 - 动态组件模板加载