lors de la construction de l'application crud dans angular 5 J'ai rencontré une question, comment puis-je utiliser le même générateur de formulaire mais changer les contrôles de formulaire que j'obtiens en fonction de ce que je veux, ajouter ou mettre à jour des utilisateurs à travers la forme ...
Voici un code simple, je vais essayer de ne pas compliquer les choses, car j'ai une forme assez grande avec beaucoup d'attributs ...
Donc, dans mon app.component.html, j'ai un formulaire
<form class="form-horizontal" [formGroup]="form" #myForm="ngForm"
(ngSubmit)="save()">
<div class="form-group">
<label for="firstName" class="control-label
required">First name</label>
<input type="text" id="firstName" class="form-control"
formControlName="firstName">
</div>
<div class="form-group">
<label for="lastName" class="control-label
required">Last name</label>
<input type="text" id="lastName" class="form-control"
formControlName="lastName">
</div>
et dans mon app.component.ts
dans mon constructeur j'ai
this.form = this.formBuilder.group({
firstName: ['', [Validators.required, Validators.minLength(2),
Validators.pattern(/^[a-zA-Z]+$/)]],
lastName: ['', [Validators.required, Validators.minLength(2),
Validators.pattern(/^[a-zA-Z]+$/)]],
});
et fonction save () pour soumettre le formulaire
save() {
let formModel = this.form.value;
formModel.id = this.Id;
if (this.Id == null) {
this._usermanagementservice.addEmployee(formModel).subscribe(() => {
//function that reloads table with employees
this.LoadAllEmployees();
});
}
else {
this._usermanagementservice.updateEmployee(this.Id, formModel).subscribe(() => {
this.LoadAllEmployees();
});
}
}
A noté que tout fonctionne, je n'ai pas inclus d'autres champs, mais voici la question, comment puis-je inclure uniquement le formulaire pour le champ du prénom lors de l'ajout d'un utilisateur et avoir SEULEMENT le nom de famille pour la mise à jour? (pour simplifier les choses, j'utilise cet exemple prénom et nom)
Merci, si vous avez besoin de plus d'informations, je me ferai un plaisir de leur fournir Ps. l'anglais est ma langue secondaire, donc les termes comme les champs, les formulaires et etc. sont à coup sûr incorrects, j'espère que vous comprendrez
Vous pouvez d'abord créer un groupe de modèles de base de votre option. Nous pouvons utiliser * ngIf dans le modèle pour masquer et afficher un groupe d'éléments sous forme. Ensuite, utilisez formBuilder pour créer une instance de formulaire à chaque fois que vous passez uniquement l'objet des contrôles de formulaire qui sont activés.
Modèle
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<label for="name">First Name:</label>
<input type="text" formControlName="fname"
placeholder="Enter name">
<br /><br />
<div *ngIf="lNameEmail1">
<label for="name">Last Name:</label>
<input type="text" formControlName="lname"
placeholder="Enter name">
<br /><br />
<label for="email">Email:</label>
<input type="email" formControlName="email"
placeholder="Enter email">
</div>
<div *ngIf="lNameEmail2">
<label for="name">Last Name2:</label>
<input type="text" formControlName="lname2"
placeholder="Enter name">
<br /><br />
<label for="email">Email2:</label>
<input type="email" formControlName="email2"
placeholder="Enter email">
</div>
<br /><br />
<button type="submit" [disabled]="!myForm.valid">Submit
</button>
<button type="submit" (click)='formGrp1()'> Form 1</button>
<button type="submit" (click)='formGrp2()'> Form 2</button>
</form>
Classe angulaire
export class AppComponent implements AfterViewInit {
public myForm: FormGroup;
lNameEmail1 = false;
lNameEmail2 = false;
myFormProperty1 = {
"fname": new FormControl("", Validators.required)
};
myFormProperty2 = {
"fname": new FormControl("", Validators.required),
"lname": new FormControl("", Validators.required),
"email": new FormControl("")
};
myFormProperty3 = {
"fname": new FormControl("", Validators.required),
"lname2": new FormControl("", Validators.required),
"email2": new FormControl("")
};
constructor(public fb: FormBuilder) {
this.myForm = this.fb.group(this.myFormProperty1);
}
formGrp1(){
alert('Form 1 enable')
this.lNameEmail1 = true;
this.lNameEmail2 = false;
this.myForm = this.fb.group(this.myFormProperty2);
this.myForm.valueChanges.subscribe(data =>
console.log('form object ====' + JSON.stringify(data)
));
}
formGrp2(){
alert('Form 2 enable')
this.lNameEmail1 = false;
this.lNameEmail2 = true;
this.myForm = this.fb.group(this.myFormProperty3);
this.myForm.valueChanges.subscribe(data =>
console.log('form object ====' + JSON.stringify(data)
));
}
onSubmit() {
console.log('Form submitted Value=='+ JSON.stringify(this.myForm.value));
}
}
L'API FormGroup
expose des méthodes telles que addControl
et removeControl
que vous pouvez utiliser pour ajouter ou supprimer des contrôles de votre groupe de formulaires après son initialisation .
Un exemple utilisant ces méthodes pourrait ressembler à ceci:
formMode: 'add' | 'update';
userForm: FormGroup;
ngOnInit() {
this.form = this.formBuilder.group({
firstName: [''],
lastName: ['']
});
}
changeMode(mode: 'add' | 'update') {
if (mode === 'add') {
if (!this.form.get('firstName')) {
this.form.addControl('firstName');
}
this.form.removeControl('lastName');
} else {
if (!this.form.get('lastName')) {
this.form.addControl('lastName');
}
this.form.removeControl('firstName');
}
}
onChange(event: 'add' | 'update') {
this.changeMode(event);
}
Vous souhaiterez probablement que votre DOM reflète l'état de votre formulaire en ajoutant *ngIf
contrôles basés sur l'existence d'un contrôle donné:
<input *ngIf="form.get('lastName')" formControlName="lastName">
addControl RemoveControl utilisant u peut masquer et afficher vos champs.
<div>
<label>Description<i class="fa fa-pencil" aria-hidden="true" (click)="editField(formControlKeys.description)"></i></label>
<h6 *ngIf="!detailForm.controls.description; else showDescriptionField">{{ projectData?.description }}</h6>
<ng-template #showDescriptionField>
<textarea formControlName="description" class="form-control" rows="2"></textarea>
<i class="fa fa-close" (click)="removeDescriptionControl()"></i>
</ng-template>
</div>
Ajouter un contrôle:
editField(this.formControlKeys.description){
this.detailForm.addControl('description', new FormControl(''));
this.detailForm.controls['description'].setValue(this.projectData.description);
}
supprimer le contrôle:
removeDescriptionControl() {
this.detailForm.removeControl('description');
}
créez d'abord le groupe de formulaires:
this.detailForm = this.formBuilder.group({
});
définir formControlKeys:
formControlKeys = {
description: 'description'
};
Il s'agit de la réplication la plus simple de l'ajout/suppression pour les contrôles de formulaire conditionnels angular).
Voyant que vous avez un formulaire avec un contrôle de case à cocher nommé someCheckboxControl
surveillez ses modifications booléennes pour ajouter/supprimer l'autre contrôle.
ngOnInit() {
this.form.controls['someCheckboxControl'].valueChanges.subscribe(someCheckboxControlVal => {
if (someCheckboxControlVal) {
this.form.addControl('SomeControl', new FormControl('', Validators.required));
} else {
this.form.removeControl('SomeControl');
}
});
}
HTML
<input *ngIf="form.get('someCheckboxControl').value" formControlName="remoteLocations"</input>