【问题标题】:Angular AutoComplete is returning value as [Object Object]Angular AutoComplete 将返回值作为 [Object Object]
【发布时间】:2019-03-11 09:49:05
【问题描述】:

我的要求是在输入框中显示选定的值,并将选定的 Id 和值获取到 .ts 文件中。由于我需要 Id 和 Value,我将选项值直接绑定到 [value]。但如果我这样做,它就会被打印为 [Object Object]。

<mat-form-field appearance="outline" class="w-100">
            <mat-label>Enter Hotel Name</mat-label>
            <input type="text" aria-label="Number" matInput [formControl]="myControl" [matAutocomplete]="auto">
            <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selectedclient($event)">
                <mat-option *ngFor="let option of clients; let i = index" [value]="option">
                    {{ option.name }}
                  </mat-option>
            </mat-autocomplete>
            <mat-icon matSuffix>location_on</mat-icon>
          </mat-form-field>

Ts 文件

    options = [
        { id: 1, name: 'One'},
        { id: 2, name: 'Two'},
        { id: 3, name: 'Three'}
       ];

selectedclient(event) {
     console.log(event.option.value);
   }

Stackblitz 编辑器网址: https://stackblitz.com/edit/angular-mat-select-data-n4tvmj

【问题讨论】:

    标签: angular angular-material-6


    【解决方案1】:

    您想使用displayWith 属性。根据手册:

    如果您希望选项的控制值(保存在表单中的内容) 不同于选项的显示值(显示在 文本字段),您需要在您的 自动完成元素。如果您愿意,一个常见的用例可能是 将数据保存为对象,但仅显示选项之一 字符串属性。

    要完成这项工作,请在您的组件类上创建一个函数来映射 控制值到所需的显示值。然后将其绑定到 自动完成的displayWith 属性。

    模板端

    <mat-autocomplete ... [displayWith]="getOptionText">
    

    脚本方面

    getOptionText(option) {
      return option.name;
    }
    

    演示:https://stackblitz.com/edit/angular-mat-select-data-cddqia

    【讨论】:

    • 它按预期工作,但我收到此错误。错误错误:未捕获(承诺中):TypeError:无法读取 null 的属性“名称”类型错误:无法在 MatAutocomplete.push../src/app/pages/hotels/homepage/homepage.component 读取 null 的属性“名称”。 ts.HomepageComponent.getOptionText [as displayWith] (homepage.component.ts:49) 在 MatAutocompleteTrigger.push../node_modules/@angular/material/esm5/autocomplete.es5.js.MatAutocompleteTrigger._setTriggerValue (autocomplete.es5.js: 925)在 autocomplete.es5.js:628
    • @GvsAkhil 一定存在您的选项为空的情况,您可以使用return option ? option.name : null; 之类的内容检查getOptionText 中的值(如果需要,将null 替换为更合适的内容)。
    • 是的,非常感谢它的工作,但有人怀疑我们没有在 [displayWith]="getOptionText" 中传递任何参数,但它返回了正确的名称。这怎么可能?
    • @GvsAkhil 这只是一个对函数的引用,Angular 会自动将您设置为 [value] 的任何内容作为其参数传递。
    • 即使使用 Angular 的 OnPush 更改检测策略,该函数也会被调用很多次。
    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 2018-05-09
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多