【问题标题】:Angular material2 Autocomplete binding with complex object list doesn't behave as it shouldAngular material2 与复杂对象列表的自动完成绑定的行为不正常
【发布时间】:2020-03-17 04:51:09
【问题描述】:

与复杂对象的自动完成绑定无法正常运行。我想将自动完成绑定到复杂对象列表并将选定的复杂对象分配给另一个,但是当我这样做时,它会在自动完成中显示 [object object]。我还创建了 plunker 来说明问题

目前它仅适用于字符串的数组列表。而不是使用普通字符串列表的绑定列表将其与复杂对象的列表绑定。

我正在使用 Angular Material v2.0.0-beta.3 Plunker Link

【问题讨论】:

  • 在 StackOverflow 中,您应该尽可能简洁地提出您的问题,而不是从 angular-material 复制您的错误请求并将其粘贴到此处。

标签: angular angular-material


【解决方案1】:

它确实按照documentation 中的描述工作。关键是使用displayWith(onSelect)来处理对象选择,如下。

HTML:

<md-input-container>
  <input type="text" mdInput [formControl]="searchControl" [mdAutocomplete]="usersComp"/>
</md-input-container>

<md-autocomplete #usersComp="mdAutocomplete" [displayWith]="getDisplayFn()">
  <md-option *ngFor="let user of filteredOptions | async" [value]="user" (onSelect)="selected(user)">
    {{user.displayName}}
  </md-option>
</md-autocomplete>

组件:

export class UserSelectComponent implements OnInit {
  @Input() value: any;
  @Output() valueChange = new EventEmitter();

  searchControl: FormControl = new FormControl();
  filteredOptions: BehaviorSubject<any[]> = new BehaviorSubject(undefined);

  constructor(private api: ApiService) {
    this.searchControl.valueChanges.subscribe(data => {
      if (typeof data === 'string' && data.trim() !== '') {
        this.filter(data);
      }
    });
  }

  ngOnInit() {
    this.searchControl.setValue(this.value ? this.value : '');
  }

  private filter(search: string) {
    this.api.get(`search/user/${search}`).subscribe(data => this.filteredOptions.next(data));
  }

  public getDisplayFn() {
     return (val) => this.display(val);
  }

  private display(user): string {
     //access component "this" here
     return user ? user.displayName : user;
  }

  public selected(user) {
    this.value = user;
    //send to parent or do whatever you want to do
    this.valueChange.emit(user);
  }
}

【讨论】:

  • onSelect 从未在文档中提及,但它确实有效。 displayWith 有问题。请参阅 GitHub repo of angular material,他们期望它作为参数,因此您将失去它的上下文(这是对您的组件类的引用)。此引用开始指向函数本身,因此,您无法访问组件函数和变量。我在我的解决方案中实施了一个解决方法,我将很快发布。话虽如此,我仍然会接受您的解决方案作为答案,因为您为我指明了正确的方向
  • 感谢您的接受。我已经修改了答案,以便[displayWith] 返回函数,然后您可以访问this 组件。
  • 干得好。我实现 displayWith 的方式就像 [displayWith]="displayFn.bind(this)"
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多