【发布时间】:2019-08-09 07:59:05
【问题描述】:
我正在为根据模型向 api 发送数据的编辑器制作原型。 这是模型:
title: string,
desc: string,
pairs: [
{
left: { label: string },
right: { label: string }
},
...
]
这里的问题是我需要使用角度形式并且我找不到显示/使用 left.label 和 right.label 的方法。
目前,我的代码(如下所示)在 typescript 中工作,因为它使用给定值(根据模型的一些模拟数据)初始化表单。如果我在给定值后记录或打印我的 formGroup,它会完全按照应有的方式显示。
但我的主要问题在于组件的 html。即使我的 formGroup 格式正确,我似乎也无法使用标签属性(当然,我想编辑它们)。
我认为是因为当我在我的formArray中创建一个pair时,我只将left和right属性设置为group中的formControl。
这是我的component.ts:
export class LinksEditorComponent implements OnInit {
@Input() exercise;
exerciseForm: FormGroup;
get pairs(): FormArray {
return this.exerciseForm.get('pairs') as FormArray;
}
constructor(private formBuilder: FormBuilder) {}
ngOnInit() {
if (!this.exercise.title || !this.exercise.desc || !this.exercise.pairs) {
this.exercise = {
title: '',
desc: '',
pairs: []
};
}
this.initExerciseForm();
}
initExerciseForm() {
this.exerciseForm = this.formBuilder.group({
title: [this.exercise.title, Validators.required],
desc: [this.exercise.desc, Validators.required],
pairs: this.formBuilder.array(
this.exercise.pairs.map(pair => this.createPair(pair)),
Validators.required
)
});
}
createPair(pair: any): FormGroup {
return this.formBuilder.group({
left: [{ label: pair.left.label }, Validators.required],
right: [{ label: pair.right.label }, Validators.required]
});
}
onAddPair() {
this.pairs.push(
this.formBuilder.group({
left: [{ label: '' }, Validators.required],
right: [{ label: '' }, Validators.required]
})
);
}
}
这是我的component.html:
<mat-card class="links-editor" *ngIf="exercise">
<form
fxLayout="column"
fxLayoutAlign="space-between center"
[formGroup]="exerciseForm"
(ngSubmit)="onSubmit()"
fxLayout="column"
>
<mat-form-field appearance="standard">
<mat-label>Title</mat-label>
<input matInput formControlName="title" />
</mat-form-field>
<mat-form-field appearance="standard">
<mat-label>Description</mat-label>
<input matInput formControlName="desc" />
</mat-form-field>
<mat-list formArrayName="pairs">
<div *ngFor="let pairControl of pairs.controls; let i = index">
<div [formGroupName]="i">
<mat-form-field appearance="standard">
<mat-label>Left chip</mat-label>
<input matInput formControlName="left" />
</mat-form-field>
<mat-form-field appearance="standard">
<mat-label>Right chip</mat-label>
<input matInput formControlName="right" />
</mat-form-field>
</div>
</div>
<button type="button" mat-mini-fab color="accent" (click)="onAddPair()">
<mat-icon>add</mat-icon>
</button>
</mat-list>
<button type="submit" mat-fab color="accent" [disabled]="exerciseForm.invalid">
<mat-icon>done</mat-icon>
</button>
</form>
</mat-card>
如果我尝试在 HTML 文件中设置 <input formControlName="left.input">,我在控制台中遇到错误,并且数据未显示。当然,如果我设置<input formControlName="left">,我会得到......好吧,左边的值:[Object object]。
【问题讨论】:
-
为什么要为 formControl 添加标签
-
@Chellappan 如您所见,它是
mat-label,仅用于样式设置。它只是 Material Angular 组件的一部分
标签: html angular typescript angular-forms