<小时><按钮[禁用]="eSave"class="btn btn-primary" (click)="save()">Save</button></app-stepper-wrapper>
ParentComponent.ts
name = 'Angular';eSave = true;form = new FormGroup({});step2 = new FormGroup({});nextForm = 假;ngOnInit() {this.form.statusChanges.subscribe(s => this.eSave = true);}移动到下一个(){如果(this.form.valid){this.nextForm = true;}}移动到上一个(){this.nextForm = false;}节省() {控制台日志(this.form);控制台.log(this.step2);}enableSave($event) {if ($event == 'VALID' && this.form.valid) {this.eSave = false;}}
示例:https://stackblitz.com/edit/angular-nynvvr>
I am making angular application with angular dynamic form where i need to split up the form into two parts.
In which i have input field firstname and lastname
at first page and on click the next button the children which has email and dropdown
needs to get loaded..
Html:
<form (ngSubmit)="onSubmit()" [formGroup]="form">
<div *ngFor="let question of questions" class="form-row">
<ng-container *ngIf="question.children">
<div [formArrayName]="question.key">
<div *ngFor="let item of form.get(question.key).controls; let i=index" [formGroupName]="i">
<div *ngFor="let item of question.children">
<app-question [question]="item" [form]="form.get(question.key).at(i)"></app-question>
</div>
</div>
</div>
</ng-container>
<ng-container *ngIf="!question.children">
<app-question [question]="question" [form]="form"></app-question>
</ng-container>
</div>
<button (click)="goBack()"> Previous </button>
<button (click)="addControls('myArray')"> Next </button>
<div class="form-row">
<button type="submit" [disabled]="!form.valid">Save</button>
</div>
</form>
Ts:
@Input() questions: QuestionBase<any>[] = [];
form: FormGroup;
payLoad = '';
page: number = 0
constructor(private qcs: QuestionControlService) { }
ngOnInit() {
this.form = this.qcs.toFormGroup(this.questions);
}
onSubmit() {
this.payLoad = JSON.stringify(this.form.value);
}
addControls(control: string) {
let question: any = this.questions.find(q => q.key == control);
let children = question ? question.children : null;
if (children)
(this.form.get(control) as FormArray).push(this.qcs.toFormGroup(children))
}
removeControls(control: string){
let array=this.form.get(control) as FormArray;
array.removeAt(array.length-1);
}
goBack() {
//Function to move to previous step
}
Working demo:
https://stackblitz.com/edit/angular-x4a5b6-p4agaq
In this demo with code you can see on every click over add button the children (array) get appended to the below in the same page..
I am also having removeControl
function which has,
removeControls(control: string){
let array=this.form.get(control) as FormArray;
array.removeAt(array.length-1);
}
To be clear i am not going to use this now and not going to remove anything anywhere.. Only thing is on click next the children via addControl
function adds the children to next next page and on previous get back to previous step.
In order to append to the same page given in demo, it should move to next page and again on click the previous it should get to original state on every next click it should give a new email and dropdown
and on previous a getback to previous step..
It should get moved like slider with sliding effect while moving forth and back..
Everything needs to be in pure angular and javascript/typescript based and there is no jquery.. As you could able to see in my demo i have not included any library or jquery..
Kindly help me to achieve the result.. Stucked for a long time..
解决方案
If you want to create stepper form you can project the form and use the formcontrol to connect the parentformgroup.
ParentComponent.ts
Next
<div class="step container" *ngIf="form.valid && nextForm" >
<form [formGroup]="step2">
<app-step2 (control)="enableSave($event)"></app-step2>
<button class="btn btn-primary" (click)="moveToPrevious()" >Previous</button>
</form>
</div>
<hr>
<button
[disabled]="eSave"
class="btn btn-primary" (click)="save()">Save</button>
</app-stepper-wrapper>
ParentComponent.ts
name = 'Angular';
eSave = true;
form = new FormGroup({});
step2 = new FormGroup({});
nextForm = false;
ngOnInit() {
this.form.statusChanges.subscribe(s => this.eSave = true);
}
moveToNext() {
if (this.form.valid) {
this.nextForm = true;
}
}
moveToPrevious() {
this.nextForm = false;
}
save() {
console.log(this.form);
console.log(this.step2);
}
enableSave($event) {
if ($event == 'VALID' && this.form.valid) {
this.eSave = false;
}
}
Example:https://stackblitz.com/edit/angular-nynvvr
这篇关于步骤向导表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!