mat-autocomplete не привязывается правильно

Я пытаюсь использовать два поля matInput, каждое из которых связывается с отдельными панелями mat-autocomplete. Выполнив шаги, здесь, я могу заставить его работать нормально, но у меня проблемы с двумя полями ввода и панелями автозаполнения.

Вот мой HTML:

<form>

  <mat-form-field>
    <input matInput [matAutocomplete]="first" [formControl]="myControl">
     <mat-autocomplete #first="matAutocomplete">
       <mat-option *ngFor="let option of filteredOptions1 | async" [value]="option">
          {{option}}
        </mat-option>
     </mat-autocomplete>
   </mat-form-field>


   <mat-form-field>
     <input matInput [matAutocomplete]="second" [formControl]="otherControl">
     <mat-autocomplete #second="matAutocomplete">
       <mat-option *ngFor="let option of filteredOptions2 | async" [value]="option">
          {{option}}
       </mat-option>
      </mat-autocomplete>
   </mat-form-field>

</form>

Вот мой компонент:

import { Component, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';
import {Observable} from 'rxjs';
import {map, startWith} from 'rxjs/operators';


@Component({
  selector: 'app-property-create',
  templateUrl: './property-create.component.html',
  styleUrls: ['./property-create.component.css']
})

export class PropertyCreateComponent implements OnInit {

  myControl = new FormControl();
  otherControl = new FormControl();

  options1: string[] = ['One', 'Two', 'Three'];
  options2: string[] = ['Four', 'Five', 'Six'];

  filteredOptions1: Observable<string[]>;
  filteredOptions2: Observable<string[]>;

  constructor() { }

  ngOnInit() {

    this.filteredOptions1 = this.myControl.valueChanges
      .pipe(
        startWith(''),
        map(value => this._filter(value))
      );

    this.filteredOptions2 = this.otherControl.valueChanges
      .pipe(
        startWith(''),
        map(value => this._filter2(value))
      );
  }

  private _filter(value: string): string[] {
    const filterValue = value.toLowerCase();

    return this.options1.filter(option => option.toLowerCase().includes(filterValue));
  }

  private _filter2(value: string): string[] {
    const filterValue = value.toLowerCase();

    return this.options2.filter(option => option.toLowerCase().includes(filterValue));
  }

}

При связывании каждого поля ввода текста с соответствующей панелью я использую [matAutocomplete] = "first", чтобы связать первую панель с первым вводом текста. Основываясь на документации Angular Material, я ожидал, что смогу связать второе поле ввода текста со второй панелью автозаполнения с помощью [matAutocomplete] = "second".

Сейчас мои панели автозаполнения отображаются в том же месте, а не в соответствующем текстовом поле.

Кто-нибудь видел это или знает, что я делаю не так?


person Jared    schedule 10.11.2018    source источник
comment
Stackblitz был бы лучшим   -  person Antoniossss    schedule 11.11.2018


Ответы (1)


Оказывается, вам не хватает классов css для элементов form и mat-form-field:

<form class="example-form">
  <mat-form-field class="example-full-width">
    <input  placeholder="Pick one" aria-label="Number" matInput [formControl]="myControl" [matAutocomplete]="first">
    <mat-autocomplete #first="matAutocomplete">
      <mat-option *ngFor="let option of filteredOptions1|async" [value]="option">
        {{option}}
      </mat-option>
    </mat-autocomplete>
  </mat-form-field>
  <mat-form-field class="example-full-width">
    <input placeholder="Pick one" aria-label="Number" matInput [formControl]="otherControl" [matAutocomplete]="second">
    <mat-autocomplete #second="matAutocomplete">
      <mat-option *ngFor="let option of filteredOptions2| async" [value]="option">
        {{option}}
      </mat-option>
    </mat-autocomplete>
  </mat-form-field>
</form>

Stackblitz здесь: https://stackblitz.com/edit/angular-gqax9d

person User3250    schedule 11.11.2018
comment
Работает в stackblitz, но не на моей машине. Будет ли CSS иметь значение для связывания текстовых полей с панелями автозаполнения? Еще одна странная вещь - заполнитель не сворачивается, когда я нажимаю внутри текстового поля. - person Jared; 12.11.2018
comment
Убедитесь, что версии материалов и @ angular / cdk совпадают, и включили ли вы css материала в проект? - person User3250; 13.11.2018
comment
Спасибо за помощь. Я попытался запустить ng add @angular/material и обнаружил ошибку: Ваш проект не использует конфигурацию по умолчанию для сборки и тестирования. Схемы Angular Material могут использоваться только с конфигурацией по умолчанию После изменения моего angular.json теперь он работает. - person Jared; 17.11.2018
comment
Прохладный! Вы это поняли. - person User3250; 18.11.2018