Angular Material Mat-Stepper: Как использовать одну и ту же группу форм для нескольких шагов?
Это моя форма группы. Я использую группу форм внутри другой:
this.shopGroup = this.fb.group({
_user: [''],
name: ['', Validators.compose([Validators.required, Validators.maxLength(60)])],
url_name: [''],
desc: ['', Validators.compose([Validators.required, Validators.maxLength(600)])],
photos: [''],
currency: ['Real'],
language: ['Português do Brasil'],
address: this.fb.group({
zipcode: ['', Validators.compose([Validators.required, Validators.pattern('[0-9]{5}[\-]?[0-9]{3}')])],
street: ['', Validators.compose([Validators.required, Validators.maxLength(70)])],
number: [null, Validators.compose([Validators.required, Validators.max(99999)])],
complement: ['', Validators.maxLength(30)],
district: ['', Validators.compose([Validators.required, Validators.maxLength(60)])],
state: ['', Validators.required],
city: ['', Validators.compose([Validators.required, Validators.maxLength(70)])]
}),
status: [true],
created_at: [new Date()],
updated_at: [new Date()]
});
Вот шаблон:
<form [formGroup]="shopGroup">
<mat-horizontal-stepper [linear]="isLinear" #stepper>
// Im not sure how to set stepControl
<mat-step [stepControl]="?">
<ng-template matStepLabel>Store Creation</ng-template>
<mat-form-field>
<input matInput placeholder="Nome" formControlName="name">
</mat-form-field>
...
<div>
<button mat-button matStepperNext type="button">Next</button>
</div>
</mat-step>
// Im not sure how to set stepControl
<mat-step formGroupName="address" [stepControl]="?">
<ng-template matStepLabel>Configuração do Envio/Frete</ng-template>
<mat-form-field>
<input matInput placeholder="CEP" formControlName="zipcode">
</mat-form-field>
...
<div>
<button mat-button matStepperPrevious>Back</button>
<button mat-button matStepperNext>Next</button>
</div>
</mat-step>
<mat-step>
<ng-template matStepLabel>Done</ng-template>
You are now done.
<div>
<button mat-button matStepperPrevious>Back</button>
</div>
</mat-step>
</mat-horizontal-stepper>
</form>
Это Angular Material
документация для отдельных форм:
<form [formGroup]="formGroup">
<mat-horizontal-stepper formArrayName="formArray" linear>
<mat-step formGroupName="0" [stepControl]="formArray.get([0])">
...
<div>
<button mat-button matStepperNext type="button">Next</button>
</div>
</mat-step>
<mat-step formGroupName="1" [stepControl]="formArray.get([1])">
...
<div>
<button mat-button matStepperPrevious type="button">Back</button>
<button mat-button matStepperNext type="button">Next</button>
</div>
</mat-step>
...
</mat-horizontal-stepper>
</form>
Я хочу использовать shopGroup
на первом шаге, затем используйте address
(группа внутри shopGroup) на втором этапе. Наконец, я хочу отправить shopGroup
, Я знаю, что мне нужно установить type="button"
между шагами и type="submit"
в конце концов, однако я не уверен, как установить [stepControl]
перейти от одного шага к другому. Как заставить его работать на шаблон (HTML)?
1 ответ
Я выбрал необходимые элементы управления вместо всей группы FormGroup на шаге [stepControl], например: <mat-step [stepControl]="shopGroup.controls['name']">
и это работает.
Вы можете прочитать в официальных документах, как вы должны обращаться с мат-степпером с одной формой
Сначала вам нужно определить массив для групп форм:
this.formGroup = this._formBuilder.group({
formArray: this._formBuilder.array([
this._formBuilder.group({
firstNameFormCtrl: ['', Validators.required],
lastNameFormCtrl: ['', Validators.required],
}),
this._formBuilder.group({
emailFormCtrl: ['', Validators.email]
}),
])
});
Во-вторых, вы должны иметь возможность вернуть массив formGroups, который будет использоваться в шаблоне HTML:
get formArray(): AbstractControl | null {
return this.dictationForm.get('formArray');
}
Тогда вы должны связать каждого mat-step
с определенной группой formArray
элемент:
<mat-step formGroupName="0" [stepControl]="formArray?.get([0])"></mat-step>
Вы можете найти рабочий пример здесь