我对Angular Material有一个Angular Reactive形式
对于我的所有控件,我添加了所需的验证器。
我不确定如何正确设置芯片控制与反应形式。
在哪里设置formControlName,以便触发所需的验证器?目前,我在输入字段中设置了它,我猜这是错误的。
我只希望courseIds是包含课程I的逗号分隔字符串。
TS:
form: FormGroup;
ngOnInit() {
this.form = new FormGroup({
name: new FormControl("", [Validators.required]),
courseIds: new FormControl("", Validators.required)
});
}HTML:
<form [formGroup]="form" (ngSubmit)="submit()">
<mat-form-field>
<input matInput type="text" formControlName="name" placeholder="Name">
</mat-form-field>
<mat-form-field>
<mat-chip-list #chipList>
<mat-chip *ngFor="let cid of courseIds" (removed) = "...">
{{cid}}
</mat-chip>
<input matInput formControlName="courseIds"
[matChipInputFor]="chipList"
placeholder="Ids"
(matChipInputTokenEnd)="add($event)">
</mat-chip-list>
</mat-form-field>
....
<button type="submit">OK</button>
</form>发布于 2019-06-07 20:34:05
尝试在<mat-chip-list>级别设置formControlName。
在模板中,将ngFor设置为循环遍历courseIds控件值
<mat-form-field>
<mat-chip-list #chipList formControlName="courseIds">
<mat-chip *ngFor="let cid of form.get('courseIds').value" (removed) = "...">
{{cid}}
</mat-chip>
<input matInput
[matChipInputFor]="chipList"
placeholder="Ids"
(matChipInputTokenEnd)="add($event)">
</mat-chip-list>
</mat-form-field>然后在您的组件中,使用courseIds的初始值创建表单组(如果有),否则使用空数组[] (因为芯片显示的是数组而不是字符串)。在add()和remove()函数中,分别添加和删除courseIds控件值中的值。
form: FormGroup;
ngOnInit() {
this.form = new FormGroup({
name: new FormControl("", [Validators.required]),
courseIds: new FormControl([], Validators.required)
});
}
add() {
...
// Add new input to courseIds control value
this.courseIds.value.push(value);
this.courseIds.updateValueAndValidity();
}
remove() {
...
// Remove element from control value array
this.courseIds.value.splice(index, 1); // where index = index of removed element
this.courseIds.updateValueAndValidity();
}
// use getter method to access courseIds control value easily
get courseIds() {
return this.form.get('courseIds');
}发布于 2020-12-01 00:13:54
当将FormArrays与nash11结合使用时,他的答案是不会起作用。我有一个问题,当我在相同的表单组中编辑另一个formArray时,mat-chip列表中的更改会丢失。
因此,这里是我的解决方案,如何使用材料芯片控制与反应形式+形式数组。
https://stackblitz.com/edit/angular-9gjwo4-h4f9ux?file=app/chips-input-example.ts
chips input-example.html:
<form [formGroup]="form">
<mat-form-field class="example-chip-list">
<mat-chip-list #chipList aria-label="Fruit selection" formArrayName="fruits">
<mat-chip *ngFor="let fruit of fruitControls.value" [selectable]="selectable" [removable]="removable"
(removed)="remove(fruit)">
{{fruit}}
<mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
</mat-chip>
<input placeholder="New fruit..."
[matChipInputFor]="chipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes"
[matChipInputAddOnBlur]="addOnBlur"
(matChipInputTokenEnd)="add($event)">
</mat-chip-list>
</mat-form-field>
</form>chips-input-example.ts
import { COMMA, ENTER } from "@angular/cdk/keycodes";
import { Component } from "@angular/core";
import { MatChipInputEvent } from "@angular/material/chips";
import {
FormControl,
FormGroup,
FormGroupDirective,
NgForm,
Validators,
FormBuilder,
FormArray
} from "@angular/forms";
/**
* @title Chips with input
*/
@Component({
selector: "chips-input-example",
templateUrl: "chips-input-example.html",
styleUrls: ["chips-input-example.css"]
})
export class ChipsInputExample {
visible = true;
selectable = true;
removable = true;
addOnBlur = true;
readonly separatorKeysCodes: number[] = [ENTER, COMMA];
form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
fruits: this.fb.array(["Lemon", "Lime", "Apple"], Validators.required)
});
}
get fruitControls(): FormArray {
return this.form.controls.fruits as FormArray;
}
add(event: MatChipInputEvent): void {
const input = event.input;
const value = event.value;
// Add our fruit
if ((value || "").trim()) {
this.fruitControls.push(this.fb.control(value));
}
// Reset the input value
if (input) {
input.value = "";
}
}
remove(fruit: string): void {
const index = this.fruitControls.value.indexOf(fruit);
if (index >= 0) {
this.fruitControls.removeAt(index);
}
}
}https://stackoverflow.com/questions/56492325
复制相似问题