I have component that has form built through form builder and now in that form i need to include a component that has only one input box as a form control.
add.ts
this.newForm = this.fb.group({
name: ['', [Validators.required]],
surname:['', [Validators.required]],
time: ''
});
"time" has to be included as a different component.
add.html
<div class="form-group">
<label class="col-md-3 control-label" for="name">{{'forms.newForm.label.configuration.name' | translate}}</label>
<div class="col-md-3">
<input type="text" formControlName="name" placeholder="placeholder"
class="form-control input-md" type="text">
<small *ngIf="!newForm.controls.name.valid && newForm.controls.name.dirty" class="text-danger">
Name is required.
</small>
</div>
<label class="col-md-3 control-label" for="surname">{{'forms.newForm.label.configuration.name' | translate}}</label>
<div class="col-md-3">
<input type="text" formControlName="surname" placeholder="placeholder"
class="form-control input-md" type="text">
<small *ngIf="!newForm.controls.surname.valid && newForm.controls.name.dirty" class="text-danger">
Surname is required.
</small>
</div>
</div>
time.html
<div>
<div class="col-md-7">
<input class="form-control input-md" type="text" (keydown)="eventHandler($event)" maxlength="11">
<small *ngIf="!validTime" class="text-danger">
Invalid time
</small>
</div>
</div>
How to i include form control "time" as a component in the main form so i can access the value through this.newForm.controls['time'].value??
A single Form Control cannot be passed separately to the child component, it has to be passed within a formGroup. So add a group (here named timeGroup) to your form:
this.newForm = this.fb.group({
name: ['', [Validators.required]],
surname:['', [Validators.required]],
timeGroup: this.fb.group({
time: ''
})
});
In your parent html pass the formGroup to your child:
<time-comp [timeGroup]="newForm.controls.timeGroup"></time-comp>
and child template:
<div [formGroup]="timeGroup">
<input formControlName="time">
</div>
And do not forget to mark the formgroup received from parent with Input:
@Input() timeGroup: FormGroup;
Then you can access the time value (in your parent) with:
this.newForm.get('timeGroup').get('time').value;
Also notice that you do not need any events, like keyup, the changes will be catched by the parent without them.
As of Angular 8, it is possible to pass FormControl as a @Input to a child component without having to put it inside a formGroup and it would still work with two-way binding. An example.. https://angular-v2yaaw.stackblitz.io
来源:https://stackoverflow.com/questions/42339589/include-a-component-as-formcontrol-angular2