Nous essayons de construire nos propres composants de champ de formulaire dans notre entreprise. Nous essayons d'envelopper les composants de la conception matérielle comme ceci:
champ:
<mat-form-field>
<ng-content></ng-content>
<mat-hint align="start"><strong>{{hint}}</strong> </mat-hint>
<mat-hint align="end">{{message.value.length}} / 256</mat-hint>
<mat-error>This field is required</mat-error>
</mat-form-field>
zone de texte:
<field hint="hint">
<input matInput
[placeholder]="placeholder"
[value]="value"
(change)="onChange($event)"
(keydown)="onKeydown($event)"
(keyup)="onKeyup($event)"
(keypress)="onKeypress($event)">
</field>
Usage:
<textbox value="test" hint="my hint"></textbox>
Il en résulte à peu près ceci:
<textbox placeholder="Personnummer/samordningsnummer" value="" ng-reflect-placeholder="Personnummer/samordningsnummer">
<field>
<mat-form-field class="mat-input-container mat-form-field>
<div class="mat-input-wrapper mat-form-field-wrapper">
<div class="mat-input-flex mat-form-field-flex">
<div class="mat-input-infix mat-form-field-infix">
<input _ngcontent-c4="" class="mat-input-element mat-form-field-autofill-control" matinput="" ng-reflect-placeholder="Personnummer/samordningsnummer" ng-reflect-value="" id="mat-input-2" placeholder="Personnummer/samordningsnummer" aria-invalid="false">
<span class="mat-input-placeholder-wrapper mat-form-field-placeholder-wrapper"></span>
</div>
</div>
<div class="mat-input-underline mat-form-field-underline">
<span class="mat-input-ripple mat-form-field-ripple"></span>
</div>
<div class="mat-input-subscript-wrapper mat-form-field-subscript-wrapper"></div>
</div>
</mat-form-field>
</field>
</textbox>
Mais j'obtiens "mat-form-field doit contenir un MatFormFieldControl" dans la console. Je suppose que cela a à voir avec mat-form-field ne contenant pas directement un matInput-field. Mais il le contient, c'est juste avec la projection ng-content.
Voici un blitz: https://stackblitz.com/edit/angular-xpvwzf
angular
angular-material2
Viktor Eriksson
la source
la source
Réponses:
Malheureusement, la projection de contenu dans le champ mat-form-field n'est pas encore prise en charge. Veuillez suivre le problème github suivant pour obtenir les dernières nouvelles à ce sujet.
À présent, la seule solution pour vous est de placer votre contenu directement dans le composant mat-form-field ou d'implémenter une classe MatFormFieldControl créant ainsi un composant de champ de formulaire personnalisé.
la source
MatInputModule
faut importer, a résolu mon problème. Comme c'est la réponse acceptée, j'ajoute le lien ici, en espérant que cela fera gagner du temps aux autres.<mat-form-field>
balise, vous devez vous assurer que vous avez correctement ajouté unmatInput
attribut sur chaqueinput
balise ou oumatNativeControl
attribut sur chaque<select>
J'ai eu ce problème. J'ai importé
MatFormFieldModule
dans mon module principal, mais j'ai oublié d'ajouterMatInputModule
auimports
tableau, comme ceci:J'espère que ça aide.
Plus d'infos ici .
la source
<mat-form-field>
balise, vous devez vous assurer que vous avez correctement ajouté unmatInput
attribut sur chaqueinput
balise ou oumatNativeControl
attribut sur chaque<select>
baliseimport { MatInputModule } from '@angular/material/input':
Solution 1 - Importer MatInputModule
importer à l'
MatInputModule
intérieur du module ieapp.module.ts
Angulaire 9+
Ci-dessous angulaire 9
Solution 2 - Erreur d'orthographe
Assurez-vous d'ajouter
matInput
et il est sensible à la casse.la source
Citant la documentation officielle ici :
la source
Cela peut également se produire si vous avez une entrée correcte dans un champ mat-form-field , mais il en a un
ngIf
. Par exemple:Dans mon cas,
mat-chip-list
est censé "apparaître" uniquement après le chargement de ses données. Cependant, la validation est effectuée et semat-form-field
plaint dePour le réparer, le contrôle doit être là, j'ai donc utilisé
[hidden]
:Une solution alternative est proposée par
Mosta
: move * ngIf pourmat-form-field
:la source
la source
Je ne suis pas sûr que cela puisse être aussi simple mais j'ai eu le même problème, changer "mat-input" en "matInput" dans le champ de saisie a résolu le problème. Dans votre cas, je vois "matinput" et mon application génère la même erreur.
"matinput"
"matInput"
la source
mdInput
àmatInput
.matInput
place demat-input
.Si quelqu'un est resté coincé avec cette erreur après avoir tenté d'imbriquer un
<mat-checkbox>
, soyez de bonne humeur! Cela ne fonctionne pas à l'intérieur d'une<mat-form-field>
balise.la source
si quelqu'un essaie d'imbriquer un
<mat-radio-group>
intérieur<mat-form-field>
comme ci-dessous, vous obtiendrez cette erreursupprimer les
<mat-form-field>
balises parentesla source
mat-form-field
le problème a disparu pour moi.<mat-form-field>
ne supporte pas le groupe radio à l'intérieur? J'avais également ce problème et je ne pensais pas simplement supprimer les balises de champ de formulaire de tapis, car cela ne semblait pas être la bonne chose à faire car de nombreux exemples de formulaires d'interface utilisateur de matériaux utilisent<mat-form-field>
. J'ai tous les différents modules d'entrée de formulaire pour les formulaires, sélectionnez les listes déroulantes et les groupes de radio définis dans mon app.module.ts comme beaucoup d'autres références de réponses.J'ai eu ce problème aussi, et j'ai un
<mat-select>
élément dans mon modèle, lorsque j'importe le MatSelectModule dans Module, cela fonctionne, cela ne fait pas de science, mais j'espère toujours que cela pourra vous aider.la source
Malheureusement, je ne peux pas me contenter de commenter certaines réponses déjà bonnes car je n'ai pas encore les points SO, cependant, il y a 3 modules clés dont vous aurez besoin pour vous assurer que vous importez dans le module parent de votre composant, en plus de ce vous devez importer directement dans votre composant. Je voulais les partager brièvement et souligner ce qu'ils font.
Les deux premiers sont pour le matériau angulaire. Beaucoup de personnes qui découvrent Angular Material en rencontrent instinctivement un et ne réalisent pas que la construction d'un formulaire nécessite les deux.
Alors, quelle est la différence entre eux?
MatFormFieldModule englobe tous les différents types de champs de formulaire disponibles dans Angular Material. Il s'agit davantage d'un module de haut niveau pour les champs de formulaire en général, alors que le MatInputModule est spécifiquement pour les types de champs `` d'entrée '', par opposition aux boîtes de sélection, aux boutons radio, etc.
Le troisième élément de la liste ci-dessus est le module de formulaires réactifs d'Angular. Le module de formes réactives est responsable d'une tonne d'amour angulaire sous le capot. Si vous allez travailler avec Angular, je vous recommande vivement de passer du temps à lire Angular Docs. Ils ont toutes vos réponses. La création d'applications n'implique que rarement des formulaires et, le plus souvent, votre application impliquera des formulaires réactifs. Pour cette raison, veuillez prendre le temps de lire ces deux pages.
Docs angulaires: formulaires réactifs
Docs angulaires: module de formulaires réactifs
Le premier document «Formulaires réactifs» sera votre arme la plus puissante lorsque vous démarrez, et le deuxième document sera votre arme la plus puissante à mesure que vous passerez à des applications plus avancées de formes réactives angulaires.
N'oubliez pas que ceux-ci doivent être importés directement dans le module de votre composant, pas dans le composant dans lequel vous les utilisez. Si je me souviens bien, dans Angular 2, nous avons importé l'ensemble des modules Angular Material dans notre module d'application principal, puis importé ce nous avions besoin directement dans chacun de nos composants. La méthode actuelle est beaucoup plus efficace IMO car nous sommes assurés d'importer l'ensemble complet des modules de matériau angulaire si nous n'en utilisons que quelques-uns.
J'espère que cela vous donnera un peu plus d'informations sur la construction de formes avec Angular Material.
la source
Si toutes les réponses à la structure / configuration du code principal ci-dessus ne résolvent pas votre problème, voici une dernière chose à vérifier: assurez-vous que vous n'avez pas invalidé votre
<input>
balise d' .Par exemple, j'ai reçu le même
mat-form-field must contain a MatFormFieldControl
message d'erreur après avoir accidentellement placé unrequired
attribut après une barre oblique à fermeture automatique/
, ce qui a effectivement invalidé mon<input/>
. En d'autres termes, j'ai fait ceci (voir la fin des attributs de balise d'entrée):faux :
à droite :
Si vous faites cette erreur ou quelque chose d'autre pour invalider votre
<input>
, vous pourriez obtenir l'mat-form-field must contain a MatFormFieldControl
erreur. Quoi qu'il en soit, ce n'est qu'une dernière chose à rechercher lors du débogage.la source
La même erreur peut se produire si vous avez une diapositive de tapis dans un tapis du champ comme seul élément dans mon cas que j'avais
Cela peut se produire si vous aviez plusieurs attributs dans la
<mat-form-field>
solution Simple pour déplacer la bascule de la diapositive à la racinela source
Vous pouvez essayer de suivre ce guide et implémenter / fournir votre propre MatFormFieldControl
la source
J'ai accidentellement retiré le tapis directive du champ de saisie qui a causé la même erreur.
par exemple.
code fixe
la source
MatRadioModule ne fonctionnera pas dans MatFormField. Les documents disent
la source
Dans mon cas, une de mes parenthèses fermantes pour "onChanges ()" a été manquée sur l'élément d'entrée et donc l'élément d'entrée n'était apparemment pas du tout rendu:
la source
Une solution partielle consiste à envelopper le champ de formulaire matériel dans un composant personnalisé et à y implémenter l'
ControlValueAccessor
interface. Outre la projection de contenu, l'effet est à peu près le même.Voir l' exemple complet sur Stackblitz.
J'ai utilisé des
FormControl
( formulaires réactifs ) à l'intérieur,CustomInputComponent
maisFormGroup
ou jeFormArray
devrais fonctionner aussi si vous avez besoin d'un élément de formulaire plus complexe.app.component.html
custom-input.component.html
la source
Vous avez manqué une
matInput
directive dans votre balise d'entrée.la source
la source
Vous pouvez définir l'apparence = "fill" dans votre balise mat-form-field, cela fonctionne pour moi
la source
appearence = "fill"
se passe iciAngulaire 9+ ... Matériel 9+
J'ai remarqué que 3 erreurs peuvent donner lieu à la même erreur:
la source
La nouvelle importation du module MatInput mise à jour est:
Selon l' API de matériaux angulaires
la source
Dans mon cas, j'ai changé ceci:
pour ça:
L'ajout de la directive matInput à la balise d'entrée a corrigé cette erreur pour moi.
la source
Vous avez peut-être manqué d'importer MatInputModule
la source
utiliser des fournisseurs dans le fichier component.ts
la source
Remarque Une erreur se produit parfois, lorsque nous utilisons la balise "mat-form-field" autour du bouton d'envoi comme:
Alors veuillez ne pas utiliser cette balise autour du bouton d'envoi
la source
J'ai eu le même problème
le problème est simple
seulement vous devez importer deux modules dans votre projet
MatFormFieldModule MatInputModule
la source
J'obtenais le même problème en raison de l'élément commenté comme suit.
Le champ de formulaire doit avoir un élément! (par exemple, l'entrée, la zone de texte, sélectionner, etc.)
la source