angular - Angular Material Select - 预选多个值
问题描述
在我的情况下,角度角色是从API接收JSON 实体并将其值分配给. 一切正常(包含所有预期值),但不会在视觉上预先选择给定值。FormGroup
FormGroup
mat-select
之前描述的所有功能都包含在onInit()
方法中。
product-group-update.component.ts: 完整代码:https ://pastebin.com/hXLqBAcF
export class ProductGroupUpdateComponent implements OnInit {
NO_PRODUCT: string = 'No product';
editProductGroupForm: FormGroup;
id: number;
isFormSubmitted = false;
availableProducts: Product[];
toSelect: Product[];
constructor(
private formBuilder: FormBuilder,
private productGroupService: ProductGroupService,
private productService: ProductService,
private router: Router,
private activatedRoute: ActivatedRoute,
private location: Location,
) {
}
ngOnInit(): void {
this.editProductGroupForm = this.formBuilder.group({
name: ['', [Validators.required, Validators.maxLength(100)]],
description: ['', [Validators.required, Validators.maxLength(100)]],
products: ['', []],
});
this.activatedRoute.paramMap.subscribe(params => {
this.id = +params.get('id');
this.productGroupService.getProductGroupById(this.id).subscribe(
receivedProductGroup => {
this.toSelect = receivedProductGroup.products;
this.editProductGroupForm.setValue({
name: receivedProductGroup.name,
description: receivedProductGroup.description,
products: receivedProductGroup.products,
});
}
);
});
console.log(this.editProductGroupForm)
this.productService.getAllProducts(new Page<Product>()).subscribe(response => {
this.availableProducts = response.content;
});
}
...
}
product-group-update-component.html 完整代码:https ://pastebin.com/9GqyU2r2
<div class="col-md-12">
<div class="card card-container">
<form (ngSubmit)="submitForm()" [formGroup]="editProductGroupForm" class="new-obj-form" id="register-form">
...
<mat-form-field appearance="fill" class="example-full-width">
<mat-label>Products</mat-label>
<mat-select formControlName="products" multiple [(value)]="toSelect">
<mat-option [value]="NO_PRODUCT">{{NO_PRODUCT}}</mat-option>
<mat-option *ngFor="let product of availableProducts" [value]="product">
{{product.name}}
<i><small>(ID: {{product.id}})</small></i>
</mat-option>
</mat-select>
</mat-form-field>
...
</form>
</div>
</div>
如您所见:editProductGroupForm
包含所有值:
还有toSelect
元素(mat-select 应该从中获取预选值):
其他代码:
export interface Product {
id: number;
name: string;
description: string;
price: number;
groupId: number;
sold: boolean;
}
import {Product} from "./product";
export interface ProductGroup {
id: number;
name: string;
description: string;
products: Product[];
}
解决方案
请记住,产品在availableProducts
和toSelect
是不同的对象。因此,即使它们具有所有相同的属性,它们仍然是不同的实例,这意味着对象的比较将返回错误 - 这就是它们未被选中的原因。
您可以使用两种不同的方法修复它:
mat-select
支持该compareWith
功能 - 因此您可以覆盖默认比较并比较它们,例如,按 Id。有关它的工作原理,请参见此处的官方 Angular 文档。材料文档中也有一个示例。- 使用 rxjs 组合您的两个 API 调用,并确保您
toSelect
是表中对象的实际实例availableProducts
。
推荐阅读
- css - 表格单元格的内边框半径
- javascript - remove button when clicked and change background color
- c# - 对 DBContext 使用依赖注入时,使用语句的外观应该如何?
- windows - 是否可以确定窗口是否在 AutoHotKey 中具有滚动功能/交互?
- javascript - 使用 JavaScript 根据其在字母表中的位置从字符串中查找得分最高的单词
- python - 按标签确定每列的计数
- python - 如何使用python删除电报聊天中的所有消息
- c# - 使用 openssl_encrypt/openssl_decrypt 将 C# TripleDES ECB 解密/加密转换为 PHP
- sql-server - 将行分组在一起以查看交易记录是否包含退款
- python - 使用 Gmail Python 发送电子邮件