【问题标题】:Angular 2+ mat-autocomplete shows [Object Object]Angular 2+ mat-autocomplete 显示 [Object Object]
【发布时间】:2019-12-10 17:29:23
【问题描述】:

我有Angular 8 mat-autocomplete[displayWith]="getDropdownView" 在哪里

getDropdownView(option) {
    console.log("getDropdownView(): option:", option);
    return "abc";  // FOR TEST
    // return option.value;
}

对于一个页面,这可以正常工作,但对于另一个页面,则显示[Object Object]。有这样的HTML代码:

<input matInput placeholder="Начните вводить..." [matAutocomplete]="auto" [id]="field.field"
    [value]="getDropdownValue(field.field)"
    (input)="loadDropdownData($event.target.value, field.field)">

<mat-autocomplete #auto="matAutocomplete" autoActiveFirstOption
    (optionSelected)="onDropdownSelected($event.option.value, field.field)"
    [displayWith]="getDropdownView">

    <mat-option *ngIf="dropdownIsLoading[field.field]" class="is-loading">
        <mat-spinner diameter="50"></mat-spinner>
    </mat-option>

    <mat-option *ngFor="let option of dropdownData[field.field]" [value]="option" style="width: 300px">
       <span>{{ option.value }}</span>
       <small> | ID: {{option.id}}</small>
    </mat-option>

</mat-autocomplete>

*.ts 也有这个方法:

getDropdownValue(field_name) {
    let id = this.model.data[field_name];
    for (let i in this.dropdownData[field_name]) {
      let option = this.dropdownData[field_name][i];
      if (option.id === id) {
        console.log("getDropdownValue(): option:", option);
        return option;
      }
    }
    console.log("getDropdownValue(): option: null");
    return null;
  }

当我通过下拉菜单更改所选项目时的执行日志(无文本输入):

  1. getDropdownValue() 用于输入的 [value] 被多次调用并使用正确的旧项目(将复合对象设置为自动完成的选择值);
  2. getDropdownView() 用于 mat-autocomplete 的 [displayWith] 被正确的新项目调用(从 new 复合对象中获取显示值);
  3. onDropdownSelected() 用于 mat-autocomplete 的 (optionSelected) 被调用并带有正确的新项目(通知 *.ts 该选项已被选择);
  4. getDropdownValue() 输入的 [value] 再次被调用多次,并带有正确的新项目。

我怎样才能得到正确的displayWith 而不是[Object Object]

【问题讨论】:

  • 你能在这里检查一下吗:stackoverflow.com/questions/44234290/…
  • 你能分享getDropdownView吗?
  • 在控制台上打印option 会得到什么?
  • 只有当值是对象类型而不是字面量时,我们才会得到[Object Object]。即{"someKey": "sameValue"};因此,您在控制台上得到的信息会告诉您从函数返回什么。
  • @SandeepKumar option 就像{"id": 1, "value": "First opt"}。我想将整个对象绑定到输入,但只显示option.value

标签: angular autocomplete


【解决方案1】:

尝试从您的&lt;input&gt; 中删除[value]="getDropdownValue(field.field)"

获取一个数组字段并将其作为模型而不是值绑定到您的输入。 然后在每次新选择时,将新值添加到现有数组中。

处理预填充:获取组件构造函数中的值并将它们全部分配给数组字段。

上述解决方案是当您不使用formControls时,如果您使用formControls,您可以将值分配给我们刚刚分配给数组的formControl字段。

【讨论】:

  • 这解决了问题,但是: 1. 这是如何工作的? 2. 为什么在另一个页面上的下拉菜单可以使用[value]
  • [value] 用于将变量绑定到您的输入字段,当我们使用自动完成时不需要这样做,因为自动完成会通过 @987654328 将所选值设置为输入@。我不确定它在另一个页面上是如何工作的,可能那里的绑定没有返回任何对象,因此自动完成值显示正确。
  • 还有一个问题:没有[value]自动补全的值在打开页面时无法预选。
  • 你能分享getDropdownValue(field.field)吗?
  • 将您的退货声明更改为:return option.value; 并保留[value]
猜你喜欢
  • 2021-12-15
  • 2018-05-16
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多