我有以下表格列出问题并有答案字段。来自api的循环列出的问题和所有这些问题需要具有相同的字段名称。一切正常,问题是我无法提交除最后一个之外的所有表单值。有没有办法为多个字段使用表单控件名称。
布展制造商 - 附加component.ts
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroupDirective, FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms';
import { ApiService } from 'src/app/shared/services/api.service';
import { AuthService } from "src/app/shared/services/auth.service";
import { Router } from '@angular/router';
@Component({
selector: 'app-move-makers-add',
templateUrl: './move-makers-add.component.html',
styleUrls: ['./move-makers-add.component.scss']
})
export class MoveMakersAddComponent implements OnInit {
moveMakerForm: FormGroup;
moveMakerId:any;
moveMakers:any='';
answer:any;
id:string='';
constructor(public authService: AuthService,private router: Router, private api: ApiService, private formBuilder: FormBuilder) { }
ngOnInit() {
this.getMoveMaker();
this.moveMakerForm = this.formBuilder.group({
'moveMakerId' : [null, Validators.required],
'answer' : [null, Validators.required],
});
}
getMoveMaker() {
this.api.getMoveMakers().subscribe(data => {
this.moveMakers = data;
});
}
onFormSubmit(form:NgForm) {
this.api.addMoveMaker(form)
.subscribe(res => {
this.router.navigate(['/dashboard']);
}, (err) => {
console.log(err);
});
}
}
移动制造商 - add.component.html
<app-header></app-header>
<!-- partial -->
<div class="container-fluid page-body-wrapper">
<!-- partial:partials/_sidebar.html -->
<app-nav></app-nav>
<!-- partial -->
<div class="main-panel">
<div class="content-wrapper">
<div class="row">
<div class="col-8 grid-margin stretch-card offset-2">
<div class="card">
<div class="card-body">
<h4 class="card-title" style="text-align:center;">{{ 'MOVE_MAKERS' | translate }}</h4>
<form class="forms-sample" [formGroup]="moveMakerForm" (ngSubmit)="onFormSubmit(moveMakerForm.value)">
<div class="form-group" *ngFor="let moveMaker of moveMakers">
<label for="exampleTextarea1">{{moveMaker.question}}</label>
<input type="text" class="form-control" formControlName="moveMakerId" id="exampleInputName1" value="{{moveMaker.id}}" >
<textarea class="form-control" id="exampleTextarea1" formControlName="answer" rows="4"></textarea>
</div>
<button class="btn btn-light">{{ 'CANCEL' | translate }}</button>
<button type="submit" class="btn btn-gradient-primary mr-2">{{ 'SAVE' | translate }}</button>
</form>
</div>
</div>
</div>
</div>
<!-- content-wrapper ends -->
<!-- partial:../../partials/_footer.html -->
<!-- partial -->
</div>
<!-- main-panel ends -->
</div>
<!-- page-body-wrapper ends -->
</div>
<!-- container-scroller -->
<!-- plugins:js -->
<script src="../../vendors/js/vendor.bundle.base.js"></script>
<script src="../../vendors/js/vendor.bundle.addons.js"></script>
<!-- endinject -->
<!-- inject:js -->
<script src="../../js/off-canvas.js"></script>
<script src="../../js/misc.js"></script>
<!-- endinject -->
<!-- Custom js for this page-->
<script src="../../js/file-upload.js"></script>
<!-- End custom js for this page-->
<app-footer></app-footer>
MoveMaker.ts
export class UserMoveMaker {
answer : any;
moveMakerId : any;
}
我通常使用不同的值动态添加formControlName,然后根据需要在.ts文件中添加验证器。在这种情况下,它看起来像这样:
移动制造商 - add.component.html
<input type="text" class="form-control" [formControlName]="moveMaker.id" id="exampleInputName1" value="{{moveMaker.id}}" >
布展制造商 - 附加component.ts
getMoveMaker() {
this.api.getMoveMakers().subscribe(data => {
this.moveMakers = data;
this.moveMakers.forEach((moveMaker ) => this.moveMakerForm .addControl(moveMaker.id, new FormControl('', Validators.required)));
});
}
实现的是Reactive表单和Template Driven的混合。如果你能采用任何一种方法会更好。
关于反应形式方法,这可以使用FormArray来实现。示例 - https://stackblitz.com/edit/angular-material-editable-table-fazhbc?file=src%2Fapp%2Fapp.component.html
关于模板驱动的表单,替换你的(ngSubmit)=“onFormSubmit(moveMakers)”