【问题标题】:Multiple autocomplete material angular shows same dropdown多个自动完成材料角度显示相同的下拉列表
【发布时间】:2018-06-21 18:00:33
【问题描述】:

我的多个下拉菜单有效,但显示的值相同。我正在关注angular material component

我为每个数组对象创建了不同的过滤器,但仍然显示相同的下拉列表。

import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';
import { Observable } from 'rxjs/Observable';
import { startWith } from 'rxjs/operators/startWith';
import { map } from 'rxjs/operators/map';
import { UsersComponent } from '../users/users.component';

@Component({
  selector: 'app-accommodation',
  templateUrl: './accommodation.component.html',
  styleUrls: ['./accommodation.component.css']
})
export class AccommodationComponent {

      myControl = new FormControl();

      country = [
        new UsersComponent('United States'),
        new UsersComponent('Canada'),
        new UsersComponent('Brazil'),
        new UsersComponent('India'),
        new UsersComponent('China'),
        new UsersComponent('Japan'),
      ];

      nationality = [
        new UsersComponent('American'),
        new UsersComponent('Canadian'),
        new UsersComponent('Indian'),
        new UsersComponent('Chinese'),
        new UsersComponent('African'),
        new UsersComponent('Japanese'),
      ];


      countryFilter: Observable<UsersComponent[]>;
      nationalityfilter: Observable<UsersComponent[]>;

      ngOnInit() {
        this.countryFilter = this.myControl.valueChanges
          .pipe(
            startWith<string | UsersComponent>(''),
            map(value => typeof value === 'string' ? value : value.name),
            map(name => name ? this.filter(name) : this.country.slice()),
          );
        this.nationalityfilter = this.myControl.valueChanges
          .pipe(
            startWith<string | UsersComponent>(''),
            map(value => typeof value === 'string' ? value : value.name),
            map(name => name ? this.filter(name) : this.nationality.slice()),
          );
      }


      filter(name: string): UsersComponent[] {

        return this.country.filter(option => option.name.toLowerCase().indexOf(name.toLowerCase()) === 0),
               this.nationality.filter(option => option.name.toLowerCase().indexOf(name.toLowerCase()) === 0);       
      }

      displayFn(users?: UsersComponent): string | undefined {
        return users ? users.name : undefined;
      }

}

下面是 HTML 代码,我根据this post 更改了 id。还是不行。

        <div class="col-sm-6">
        <mat-form-field class="example-full-width">
            <input type="text" placeholder="Country" aria-label="Country" matInput [formControl]="myControl" [matAutocomplete]="auto">
            <mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFn">
                <mat-option *ngFor="let option of countryFilter | async" [value]="option">
                    {{ option.name }}
                </mat-option>
            </mat-autocomplete>
        </mat-form-field>
    </div>
    <!-- col end -->
    <div class="col-sm-6">
        <mat-form-field class="example-full-width">
            <input type="text" placeholder="Nationality" aria-label="Nationality" matInput [formControl]="myControl" [matAutocomplete]="auto">
            <mat-autocomplete #autoNationality="matAutocomplete" [displayWith]="displayFn">
                <mat-option *ngFor="let option of nationalityfilter | async" [value]="option">
                    {{ option.name }}
                </mat-option>
            </mat-autocomplete>
        </mat-form-field>
    </div>
    <!-- col end -->

@Mjstk 更新后效果很好,但仍然显示一些错误

【问题讨论】:

    标签: angular angular-material


    【解决方案1】:

    请更改以下内容:

    1. autoautoNationality, [matAutocomplete]="autoNationality"
    2. [formControl]="myControl" -> formControlName="myControl"

    【讨论】:

      【解决方案2】:

      您必须更改第二个自动完成的名称,因此它也不会链接到第一个,将“auto”更改为“autoNationality”:[matAutocomplete]="autoNationality">

      <mat-form-field class="example-full-width">
                  <input type="text" placeholder="Nationality" aria-label="Nationality" matInput [formControl]="myControl" [matAutocomplete]="autoNationality">
                  <mat-autocomplete #autoNationality="matAutocomplete" [displayWith]="displayFn">
                      <mat-option *ngFor="let option of nationalityfilter | async" [value]="option">
                          {{ option.name }}
                      </mat-option>
                  </mat-autocomplete>
              </mat-form-field>
      

      【讨论】:

      • 它有效,但是当我聚焦输入时它仍然显示错误。任何想法 ?我已经发布了有问题的错误截图。
      • 尝试将 [formControl]="myControl" 更改为:formControlName="myControl"
      • 是的,它做得很好。我还将其更改为 .ts 文件。它工作得很好
      • 嗯,它做得很好,但在文档中应该更清楚......或者我不知道也许我错过了什么
      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2019-02-18
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多