gpt4 book ai didi

Angular Material : mat-select multiple default value for object selection using reactive forms

转载 作者:行者123 更新时间:2023-12-02 19:40:13 33 4
gpt4 key购买 nike

我正在使用启用多选的 react 形式和 Angular Material 垫选择创建一个形式。我有一个要加载到 mat select 中的对象列表,我想默认预选该列表中的一些项目。

默认选择与字符串(下例中的苏打水)配合使用效果很好,默认项目显示为选中图标,垫选择元素值已加载它们,如果我添加更多项目,它们将添加到现有项目中值域。

但是我想在 mat select 中加载的项目是对象(下面示例中的 energyDrinks),当我为 mat select 字段设置值时,即使字段值设置正确,它也不会默认检查它们。另外,如果我添加一个项目,值字段中的现有数据将被新项目覆盖。

有什么方法可以让我在 UI 选择框中选中预先选择的项目,并将新添加的项目添加到 mat-select 元素的现有值中?

提前致谢

下面是示例代码-

html-

<form [formGroup]="drinkCategory">

<mat-form-field class="full-width">
<mat-select multiple formControlName="sodaName">
<mat-option *ngFor="let soda of sodaList" [value]="soda">
{{soda}}
</mat-option>
</mat-select>
</mat-form-field>

<p>{{drinkCategory.get('sodaName').value | json}}</p>


<mat-form-field class="full-width">
<mat-select multiple formControlName="energyDrinkName">
<mat-option *ngFor="let energyDrink of energyDrinksList" [value]="energyDrink">
{{energyDrink.name}}
</mat-option>
</mat-select>
</mat-form-field>

<p>{{drinkCategory.get('energyDrinkName').value | json}}</p>
</form>

ts 文件 -

import { Component , ViewChild} from '@angular/core';
import { FormBuilder, FormGroup,FormControl,Validators } from '@angular/forms';

@Component({
selector: 'drink-example',
styleUrls: ['drink-example.css'],
templateUrl: 'drink-example.html',
})
export class DrinkExample {
drinkCategory: FormGroup;

sodaList =['coke','pepsi','sprite'];
selecteSodas =['coke','sprite'];

energyDrinksList=[{
id:'1',
name:'redbull'
},{
id:'2',
name:'monster'
},{
id:'3',
name:'gatorade'
}];
selectedEnergyDrinks=[{
id:'1',
name:'redbull'
}];

constructor(private fb: FormBuilder){}

ngOnInit() {

this.drinkCategory = this.fb.group({
sodaName: [null, Validators.required],
energyDrinkName:[null, Validators.required]
});
this.drinkCategory.get('sodaName').setValue(this.selecteSodas);
this.drinkCategory.get('energyDrinkName').setValue(this.selectedEnergyDrinks);
}
}

UI Screenshot of the mat select elements

最佳答案

您需要使用 compareWith按 id 比较选项的函数。

将函数添加到组件中:

compareWith(drink1: any, drink2: any): boolean {
return drink1 && drink2 && drink1.id === drink2.id;
}

然后将其设置为两个 MatSelect 控件上的 compareWith 值:

 <form [formGroup]="drinkCategory">
<mat-form-field class="full-width">
<mat-select multiple formControlName="sodaName" [compareWith]="compareWith">
<mat-option *ngFor="let soda of sodaList" [value]="soda">
{{ soda }}
</mat-option>
</mat-select>
</mat-form-field>

<p>{{ drinkCategory.get('sodaName').value | json }}</p>

<mat-form-field class="full-width">
<mat-select
multiple
formControlName="energyDrinkName"
[compareWith]="compareWith"
>
<mat-option
*ngFor="let energyDrink of energyDrinksList"
[value]="energyDrink"
>
{{ energyDrink.name }}
</mat-option>
</mat-select>
</mat-form-field>

<p>{{ drinkCategory.get('energyDrinkName').value | json }}</p>
</form>

关于 Angular Material : mat-select multiple default value for object selection using reactive forms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60359271/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com