然后当用户输入一些数据时,从 DB 中获取的相关甜点列表数据应该以预先填充的 mat-chips 列表格式显示如下:(如果这不可能,我们可以显示一个预先填充的可用甜点列表的下拉列表来自 db 以便用户可以从中进行选择),但已选择的值(重复)不应出现在下拉列表中或通过键入用户再次选择,无论是在对话框仍然打开还是关闭并再次打开时。因为选择的甜点应该是唯一的,因为选择的这个芯片数据将存储在数据库的另一个表中。
用户可以从可用的显示芯片列表项中删除或添加他想要的任何芯片,然后单击提交。但是这里的条件应该是,一旦选择了一个芯片项(不关闭该项目使其被选中提交),不应该通过再次键入或上次提交后选择重复的芯片项,这意味着:例如,如果我如图所示,预先填充了 5 个芯片项目,用户不应该能够键入新的芯片项目并提交,并且如果选择了芯片 4 和芯片 5 并且芯片 1、芯片 2、芯片 3 从显示的列表中关闭(删除),那么只有没有重复的 1 个芯片 4 和 1 个芯片 5 应该在提交时传递到在按钮单击事件上调用此对话框的页面。再次,当用户打开此对话框时,先前选择的芯片 4 &
我已经尝试完全按照下面的 Angular Material 文档中提到的方式实现各种垫芯片列表的自动完成,但这会打开一个下拉列表,而不是根据所需的格式。
甜点.component.html:
<div mat-dialog-content>
<form>
<div>
<mat-form-field appearance="outline">
<mat-label>Dessert*</mat-label>
<mat-chip-list multiple #chipList>
<mat-chip
*ngFor="let dessert of desserts"
[selectable]="selectable"
[removable]="removable"
(removed)="remove(dessert)">
{{dessert}}
<mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
</mat-chip>
<input
placeholder="Dessert Name"
#dessertInput
[formControl]="dessertListCtrl"
[matAutocomplete]="auto"
[matChipInputFor]="chipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes"
[matChipInputAddOnBlur]="addOnBlur"
(matChipInputTokenEnd)="add($event)">
</mat-chip-list>
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="selected($event)">
<mat-option *ngFor="let dessert of filteredDesserts | async" [value]="dessert">
{{dessert}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<button mat-button (click)="onSubmit()">Submit</button>
</div>
</form>
</div>
甜点.component.ts:
export class DessertsComponent{
selectable = true;
removable = true;
addOnBlur = true;
separatorKeysCodes: number[] = [ENTER, COMMA];
dessertListCtrl = new FormControl();
filteredDesserts: Observable<string[]>;
desserts: string[] = [];
dessertsList: any = [];
@ViewChild('dessertInput',{static: false}) dessertInput: ElementRef<HTMLInputElement>;
@ViewChild('auto',{static: false}) matAutocomplete: MatAutocomplete;
constructor(
private dbService: DBService,
public dialogRef: MatDialogRef<DessertsComponent>,
@Inject(MAT_DIALOG_DATA) public data: any,
) {
this.dessertsListData();
this.filteredDesserts = this.dessertListCtrl.valueChanges.pipe(
startWith(null),
map((dessert: string | null) => dessert ? this._filter(dessert) : this.dessertsList.slice()));
}
dessertsListData(){
this.dbService.dessertsListData().subscribe(
(response: any) => {
this.dessertsList = response;
});
}
add(event: MatChipInputEvent): void {
if (!this.matAutocomplete.isOpen) {
const input = event.input;
const value = event.value;
if ((value || '').trim()) {
this.desserts.push(value.trim());
}
if (input) {
input.value = '';
}
this.dessertListCtrl.setValue(null);
}
}
remove(dessert: string): void {
const index = this.desserts.indexOf(dessert);
if (index >= 0) {
this.desserts.splice(index, 1);
}
}
selected(event: MatAutocompleteSelectedEvent): void {
this.desserts.push(event.option.viewValue);
this.dessertInput.nativeElement.value = '';
this.dessertListCtrl.setValue(null);
}
private _filter(value: string): string[] {
const filterValue = value.toLowerCase();
return this.dessertsList.filter(dessert => dessert.toLowerCase().indexOf(filterValue) === 0);
}
onSubmit(){
this.dialogRef.close({data: this.desserts});
}
}
此甜点组件正在从另一个组件调用 this.dialog.open(DessertsComponent)
我不是 Angular Material(v7) 方面的专家,因此如果为这个问题提供任何解决方案,我将不胜感激。