J'utilise matInput
y mat-form-field
(@angular/material) dans un composant Angular, et je ne parviens pas à désactiver l'élément matInput
.
Un exemple fonctionnel peut être vu ici.
Il est probable que je manque quelque chose d'évident, mais je n'arrive pas à trouver quoi. Est-ce un bug ?
Si je retire [formControlName]
de la CustomFormInputComponent
alors je peux désactiver avec succès le matInput
CustomFormInputComponent
:
import { Input, Component } from '@angular/core';
import { FormGroup } from '@angular/forms';
@Component({
selector: 'app-custom-form-input',
template: `
<mat-form-field [formGroup]="form">
<input matInput placeholder='Name' [formControlName]="formControlName" [disabled]='disabled'>
</mat-form-field>
`,
})
export class CustomFormInputComponent {
@Input() form: FormGroup;
@Input() formControlName: string = 'name';
@Input() disabled = false;
}
AppComponent
:
import { Component } from '@angular/core';
import { FormBuilder } from '@angular/forms';
@Component({
selector: 'my-app',
template: `
<p>At least one of these inputs should be disabled, but none are :(</p>
<app-custom-form-input [form]="form" [disabled]='true'></app-custom-form-input>
<app-custom-form-input [form]="form" [disabled]="'disabled'"></app-custom-form-input>
`,
})
export class AppComponent {
public form: any;
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.form = this.fb.group({
name: ''
})
}
}
Tout commentaire est le bienvenu !
Réponse :
Pour un peu plus de contexte sur la réponse de David : Angular met à jour l'état du DOM en fonction de l'état désactivé d'un contrôle de formulaire réactif. Ce que je pense qu'il se passe : angular rend le contrôle de formulaire CustomFormInputComponent
avant le AppComponent
et rend le composant comme désactivé. Ensuite, l'AppComponent est rendu et l'élément form
est construit avec le name
contrôle activé. Angular va ensuite désactiver l'élément d'entrée DOM (qui se comporte comme prévu).