【问题标题】:Angular Material Autocomplete not retaining selectionAngular Material Autocomplete 不保留选择
【发布时间】:2019-11-22 23:54:15
【问题描述】:

我正在尝试使用从后端服务器获取用户列表的 Angular Material 实现自动完成输入字段。

我已经设法将数据放入自动完成下拉列表中并且过滤工作正常。不幸的是,当从下拉列表中选择一个项目时,它不会显示在输入框中。

控制器:

export class SignalMutateComponent implements OnInit {

  visible = true;
  selectable = true;
  removable = true;
  addOnBlur = true;
  readonly separatorKeysCodes: number[] = [ENTER, COMMA];
  options: User[] = []
  filteredOptions: Observable<User[]>;
  assigneeId = new FormControl();


  private _signalMutate: Signal;
  @Input() set signalMutate(signalMutate: Signal) {
    this._signalMutate = signalMutate
    this.signalForm.patchValue(signalMutate);
    if(signalMutate.labels) {
        this.labels = signalMutate.labels.split(',');
        if(this.labels[0] == "") {this.labels.shift();}
      } else {
        this.labels = [];
      }

  }


get signalMutate() {
  return this._signalMutate
}

  signalForm: FormGroup;
  loading = false;
  submitted = false;
  error: string;
  formSignalValue: Signal;
  labels: [string] = [];

  constructor(
    private formBuilder: FormBuilder,
    private router: Router,
    private authenticationService: AuthenticationService,
    private userService: UserService,
    private signalService: SignalService,
    private snackBar: MatSnackBar

  ) { }

  ngOnInit() {

    this.userService.getFiltered("active")
      .subscribe(users => {this.options = users as User[]; });

    this.signalForm = this.formBuilder.group({
      title: [''],
      description: ['', Validators.required],
      problem: ['', Validators.required],
      value: ['', Validators.required],
      requestor: ['', Validators.required],
      labels: [''],
      id:[''],
      assigneeId: ['']
  });

    this.filteredOptions = this.assigneeId.valueChanges
    .pipe(
      startWith(''),
      map(value => typeof value === 'string' ? value : this.updateAssignee(value)),
      map(fullName => fullName ? this._filter(fullName) : this.options.slice())
    );

  }

  displayFn(user?: User): string | undefined {
    return user ? user.fullname : undefined;
  }

  private _filter(name: any): User[] {
    console.log("name");
    console.log(name);
    const filterValue = name.toLowerCase();
    console.log(filterValue);
    return this.options.filter(option => option.fullName.toLowerCase().indexOf(filterValue) === 0);
  }


  updateAssignee(id: number) {

      console.log('yes: '+id);
      this.signalForm.patchValue({assigneeId: id});

  }
....

HTML 文件:

 <div class="uk-width-1-1">
                            <mat-form-field class="formFieldWidth700">
                                    <input type="text" placeholder="Assignee" aria-label="Assignee" matInput [formControl]="assigneeId" [matAutocomplete]="auto" [ngClass]>
                                    <mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFn">
                                      <mat-option *ngFor="let option of filteredOptions | async" [value]="option.id">
                                        {{option.fullName}}
                                      </mat-option>
                                    </mat-autocomplete>
                                  </mat-form-field>
                    </div>

任何帮助将不胜感激!

谢谢

【问题讨论】:

  • assigneeID 字段在哪里?

标签: angular angular-material


【解决方案1】:

找到答案:


displayFn(id?: number): string | undefined {
  if (!id) return undefined;

  let index = this.options.findIndex(options => options.id === id);
  return this.options[index].fullName;
}

显示功能需要使用 id,因为这是在值中选择的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多