角度-对象作为选择选项值

Cod*_*ise 3 typescript angular-material angular angular-forms

我有一个带有各种选择框的表单,这些选择框使用对象作为值:

<mat-option [value]="object">

当我通过表单创建新记录时,这非常有用。现在,当我编辑记录时,我遇到objectmat-select-option不是我从休息服务中获得的“相同”对象,因此编辑记录时没有选择我的选择框。

object.id在决定选择哪个选项时,是否可以告诉选择框窗口小部件匹配?我想可能需要编写一条指令来处理此问题,但是使用Angular或Angular Material库或其他现有解决方案可能已经可以实现。

详细来说,我有我的foo.component.ts文件:

let item = {
    'fruit': { id: 1, 'label': 'Pineapple' },
}

let options = [
    { 'id':1, 'label': 'Pineapple' },
    { 'id':2, 'label': 'Banana' },
    { 'id':3, 'label': 'Papaya' }
]
Run Code Online (Sandbox Code Playgroud)

而我的.html文件:

<mat-select  placeholder="Fruit" [(ngModel)]="item.fruit">
  <mat-option *ngFor="let option of options" [value]="option">{{option.label}}</mat-option>
</mat-select>
Run Code Online (Sandbox Code Playgroud)

用户访问页面时,他们应该看到在中选择的“菠萝” mat-select。由于item.fruitoptions数组中的“菠萝” 没有指向同一个“菠萝”对象,因此- mat-select为空。

我想看到类似的东西:

<mat-select          
    placeholder="Fruit" 
    [(ngModel)]="item.fruit" 
    equalityAttr="id"
>
Run Code Online (Sandbox Code Playgroud)

Cod*_*ise 6

这是[compareWith]指令。Angular.io目前处于关闭状态,因此我将继续阅读本文,以供参考。

的HTML

<mat-select  
    placeholder="Fruit" 
    [(ngModel)]="item.fruit"
    [compareWith]="objectComparisonFunction">

   <mat-option *ngFor="let option of options" [value]="option">{{option.label}}</mat-option>
</mat-select>
Run Code Online (Sandbox Code Playgroud)

打字稿

  public objectComparisonFunction = function( option, value ) : boolean {
    return option.id === value.id;
  }
Run Code Online (Sandbox Code Playgroud)

  • 于 2021 年更新,遇到了同样的问题,只需将 ``` [(ngModel)] = "item.fruit" ``` 更改为 ``` [(value)] = "item" `` ` 其他一切都保持不变。 (2认同)
  • 嗯,我发现`value`可能是未定义的,所以我使用了`return option.id === value?.id`。 (2认同)