Existe-t-il un moyen de désactiver et de rendre tous les champs non modifiables(input / mat-select / textfield / option/input/mat-checkbox etc)
dans un formulaire
en indiquant uniquement le nom div parent dans Angular/Angular-material? (impossible de les modifier)
@Component({
templateUrl: './leaseholder.component.html'
})
export class LeaseholderComponent implements OnInit, IFormDirtyWarningComponent {
leaseholderForm: FormGroup;
constructor(private router: Router, private formBuilder: FormBuilder) {
this.createLeaseholderForm();
}
createLeaseholderForm() {
this.leaseholderForm = this.formBuilder.group({
civility: [this.identityModel.civility],
firstName: [this.identityModel.firstName, Validators.compose([Validators.pattern("[^\\d]+")])],
lastName: [this.identityModel.lastName, Validators.compose([Validators.pattern("[^\\d]+")])],
birthName: [this.identityModel.birthName, Validators.compose([Validators.pattern("[^\\d]+")])],
birthDate: [this.identityModel.birthDate],
birthPlace: [this.identityModel.birthPlace, Validators.compose([Validators.pattern("[^\\d]+")])],
nationality: ['FR', this.identityModel.nationality],
endOfStay: [this.identityModel.endOfStay]
});
}
<form [formGroup]="leaseholderForm" (ngSubmit)="onSubmit()">
<div class="mat-radio-group-inverted">
<mat-radio-group formControlName="civility">
<mat-radio-button color="primary" value="MR">M.</mat-radio-button>
<mat-radio-button color="primary" value="MME">MME.</mat-radio-button>
</mat-radio-group>
</div>
<mat-form-field>
<input matInput upperCaseInput placeholder="Nom d'usage" formControlName="lastName">
</mat-form-field>
...........................
.......... example
</form>
Si vous utilisez une forme réactive, vous pouvez y parvenir par programme comme ceci (approche un par un):
this.formGroupName.controls[controlNmae].disable();
Par exemple: this.formGroupName.controls['lastName'].disable()
Pour désactiver tout à la fois:
this.formGroupName.disable()
Dans votre cas, faites: this.leaseholderForm.disable()
Et pour le retourner, faites: this.leaseholderForm.enable()
Vous pouvez créer une fonction comme celle-ci et l'appeler après avoir appelé createLeaseholderForm()
:
disableForm() {
this.leaseholderForm.disable()
}
pour plus d'informations, lisez this .
Les personnes handicapées et non modifiables ne sont pas nécessairement la même chose. Une entrée désactivée n'est bien sûr pas non plus modifiable, mais elle a une apparence distincte - grisée et semble "désactivée". Une entrée en lecture seule ressemble à une entrée normale, mais n'est pas modifiable. Vous devez donc vous demander si vous souhaitez que vos contrôles soient réellement désactivés ou simplement en lecture seule. On dirait que vous voulez juste en lecture seule. Pour ce faire, il vous suffit d'utiliser la propriété readonly
de <input>
et le lier à une variable dans votre contrôleur. Par exemple:
export class LeaseholderComponent implements OnInit, IFormDirtyWarningComponent {
@Input() editable: boolean = false; // doesn't have to be an @Input
...
}
<form [formGroup]="leaseholderForm" (ngSubmit)="onSubmit()">
<mat-form-field>
<input matInput [readonly]="!editable" upperCaseInput placeholder="Nom d'usage" formControlName="lastName">
</mat-form-field>
...
</form>
Notez que la propriété editable
n'a pas besoin d'être un @Input
, mais cela peut être utile si vous utilisez le formulaire en tant que composant réutilisable et devez prendre la décision modifiable/en lecture seule au niveau DOM.
Pour d'autres composants comme les boutons radio, où aucune propriété readonly
n'est disponible, vous devriez probablement repenser la disposition. Il peut être plus judicieux d'utiliser un composant différent pour afficher l'option radio en mode lecture seule, plutôt que la liste complète des options. Par exemple, utilisez une étiquette et une paire de valeurs:
<div *ngIf="editable; else readonlyRadio" class="mat-radio-group-inverted">
<mat-radio-group formControlName="civility">
<mat-radio-button color="primary" value="MR">M.</mat-radio-button>
<mat-radio-button color="primary" value="MME">MME.</mat-radio-button>
</mat-radio-group>
</div>
<div #readonlyRadio>
<label>Civility</label>
<span>{{ leaseholderForm.controls['civility'].value }}</span>
</div>
Étant donné que l'attribut désactivé ne fonctionne pas sur certains composants, ce que j'ai fait est que j'ai défini pointeur-événements: aucun sur le CSS pour couvrir tous les composants à l'intérieur du contenu div .
Voici mon code CSS:
.disabledDiv {
pointer-events: none;
opacity: 0.4; }
Voici mon HTML:
<div class="content-area" [ngClass]="{disabledDiv: !isActiveDiv}">
<!-- other components here (input/select/etc.) -->
<div>
Et sur mon TS:
editData() {
this.isActiveDiv = true;
}
Créez un FormGroup comme expliqué ici:
https://angular.io/guide/reactive-forms#add-a-formgroup
Ensuite, récupérez l'instance formGroup
par programme et appelez .disable()
dessus, comme ceci:
this.leaseholderForm.disable()
Utilisez l'attribut disable
dans le modèle html.
<mat-form-field>
<input matInput upperCaseInput placeholder="Nom d'usage" formControlName="lastName" disable>
</mat-form-field>
this.formGroupName.controls['lastName'].disable()
N'a pas fonctionné pour moi dans Angular 8. Je l'ai donc fait fonctionner en ajoutant un attribut 'readonly' à l'intérieur du HTML et ensuite changer sa valeur dans le fichier .ts.
à l'intérieur du fichier .html
<input formControlName="email" matInput type="email" #email email="true" [readonly]="email_readonly" />
à l'intérieur du fichier .ts
email_readonly = false;
yourFunction()
{
this.email_readonly = true;
}