Угловой 5 Угловой материал 2 - автозаполнение с минимальной длиной - PullRequest
0 голосов
/ 09 мая 2018

Я добавил поле автозаполнения в форму, чтобы выбрать пациента. Данные пациента поступают из базы данных. Проблема в том, что есть 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()));
 }

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Есть еще один способ сделать это, и рекомендуется здесь .

Это в основном проверка длины вашего filter метода.

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

    return this.listPatients.filter(patient =>
      patient.name.toLowerCase().includes(name.toLowerCase()));
  }
0 голосов
/ 09 мая 2018

ОК, решено добавлением в 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);
      });
}

}

...