Estamos tratando de construir nuestros propios componentes de campo de formulario en nuestra empresa. Estamos tratando de envolver los componentes del diseño de materiales de esta manera:
campo:
<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>
caja de texto:
<field hint="hint">
<input matInput
[placeholder]="placeholder"
[value]="value"
(change)="onChange($event)"
(keydown)="onKeydown($event)"
(keyup)="onKeyup($event)"
(keypress)="onKeypress($event)">
</field>
Uso:
<textbox value="test" hint="my hint"></textbox>
Esto da como resultado aproximadamente esto:
<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>
Pero obtengo "mat-form-field debe contener un MatFormFieldControl" en la consola. Supongo que esto tiene que ver con mat-form-field que no contiene directamente un matInput-field. Pero lo está conteniendo, solo está dentro de la proyección de contenido ng.
Aquí hay un bombardeo: https://stackblitz.com/edit/angular-xpvwzf
angular
angular-material2
Viktor Eriksson
fuente
fuente
Respuestas:
Desafortunadamente, la proyección de contenido en mat-form-field aún no es compatible. Siga el siguiente problema de github para obtener las últimas noticias al respecto.
Por ahora, la única solución para usted es colocar su contenido directamente en el componente mat-form-field o implementar una clase MatFormFieldControl creando así un componente de campo de formulario personalizado.
fuente
MatInputModule
debe importarse, resolvió mi problema. Como esta es la respuesta aceptada, agrego el enlace aquí, con la esperanza de que ahorre tiempo a los demás.<mat-form-field>
etiqueta debe asegurarse de agregar correctamente elmatInput
atributo en cadainput
etiqueta omatNativeControl
atributo en cada<select>
Tuve este problema Importé
MatFormFieldModule
en mi módulo principal, pero olvidé agregarMatInputModule
a laimports
matriz, así:Espero eso ayude.
Más información aquí .
fuente
<mat-form-field>
etiqueta debe asegurarse de agregar correctamente elmatInput
atributo en cadainput
etiqueta omatNativeControl
atributo en cada<select>
etiquetaimport { MatInputModule } from '@angular/material/input':
Solución 1 - importar MatInputModule
importar
MatInputModule
dentro del módulo, es decirapp.module.ts
Angular 9+
Por debajo del angular 9
Solución 2 - Error de ortografía
Asegúrese de agregar
matInput
y es sensible a mayúsculas y minúsculas.fuente
Citando de la documentación oficial aquí :
fuente
Esto también puede suceder si tiene una entrada adecuada dentro de un campo de formulario mat , pero tiene una entrada
ngIf
. P.ej:En mi caso,
mat-chip-list
se supone que "aparece" solo después de cargar sus datos. Sin embargo, la validación se realiza y semat-form-field
queja conPara solucionarlo, el control debe estar allí, así que he usado
[hidden]
:Una solución alternativa es propuesta por
Mosta
: move * ngIf paramat-form-field
:fuente
fuente
No estoy seguro de si podría ser así de simple, pero tuve el mismo problema, cambiar "mat-input" a "matInput" en el campo de entrada resolvió el problema. En su caso, veo "matinput" y está causando que mi aplicación arroje el mismo error.
"matinput"
"matInput"
fuente
mdInput
amatInput
.matInput
lugar demat-input
.Si alguien se atascó con este error después de intentar anidar a
<mat-checkbox>
, ¡anímate! No funciona dentro de una<mat-form-field>
etiqueta.fuente
si alguien está tratando de anidar un
<mat-radio-group>
interior<mat-form-field>
como el siguiente, obtendrá este erroreliminar las
<mat-form-field>
etiquetas principalesfuente
mat-form-field
hizo que el problema desapareciera para mí.<mat-form-field>
no sea compatible con el grupo de radio dentro de él? También estaba teniendo este problema y no pensé en eliminar las etiquetas de campo de formulario de estera porque no parecía que fuera lo correcto, ya que se usan muchos materiales de ejemplos de formularios de interfaz de usuario<mat-form-field>
. Tengo todos los diversos módulos de entrada de formularios de materiales para formularios, menús desplegables seleccionados y grupos de radio definidos en mi app.module.ts como muchas de las otras referencias de respuestas.También tuve este problema, y tengo un
<mat-select>
elemento en mi plantilla, cuando importo el MatSelectModule en el Módulo, funciona, no hace ciencia, pero espero que pueda ayudarlo.fuente
Desafortunadamente, no puedo comentar algunas respuestas ya buenas, ya que todavía no tengo los puntos SO, sin embargo, hay 3 módulos clave que necesitará para asegurarse de que está importando al módulo principal de su componente, aparte de lo que tienes que importar directamente a tu componente. Quería compartirlos brevemente y resaltar lo que hacen.
Los dos primeros son para material angular. Muchas personas nuevas en Angular Material se encontrarán instintivamente con uno de estos y no se darán cuenta de que construir una forma requiere ambos.
Entonces, ¿cuál es la diferencia entre ellos?
MatFormFieldModule abarca todos los diferentes tipos de campos de formulario que Angular Material tiene disponible. Este es más un módulo de alto nivel para campos de formulario en general, mientras que MatInputModule es específicamente para tipos de campo de 'entrada', en lugar de cuadros de selección, botones de opción, etc.
El tercer elemento en la lista anterior es el Módulo de formularios reactivos de Angular. El módulo de formas reactivas es responsable de una tonelada de amor angular bajo el capó. Si vas a trabajar con Angular, te recomiendo que pases un tiempo leyendo Angular Docs. Tienen todas tus respuestas. La creación de aplicaciones rara vez NO involucra formularios, y la mayoría de las veces, su aplicación incluirá formularios reactivos. Por esa razón, tómese el tiempo de leer estas dos páginas.
Documentos angulares: formas reactivas
Documentos angulares: módulo de formularios reactivos
El primer documento 'Formas reactivas' será su arma más poderosa cuando comience, y el segundo documento será su arma más poderosa a medida que avance en aplicaciones más avanzadas de Formas reactivas angulares.
Recuerde, estos deben importarse directamente en el módulo de su componente, no en el componente en el que los está utilizando. Si no recuerdo mal, en Angular 2, importamos el conjunto completo de módulos de material angular en nuestro módulo de aplicación principal, y luego importamos qué Necesitábamos en cada uno de nuestros componentes directamente. El método actual es una OMI mucho más eficiente porque estamos garantizados para importar el conjunto completo de módulos de material angular si solo usamos algunos de ellos.
Espero que esto proporcione un poco más de información sobre la creación de formas con material angular.
fuente
Si todas las respuestas de configuración / estructura del código principal anteriores no resuelven su problema, aquí hay una cosa más que debe verificar: asegúrese de no haber invalidado de alguna manera su
<input>
etiqueta.Por ejemplo, recibí el mismo
mat-form-field must contain a MatFormFieldControl
mensaje de error después de colocar accidentalmente unrequired
atributo después de una barra oblicua/
, lo que efectivamente invalidó mi<input/>
. En otras palabras, hice esto (ver el final de los atributos de la etiqueta de entrada):mal :
derecha :
Si comete ese error u otra cosa para invalidar su
<input>
, entonces podría obtener elmat-form-field must contain a MatFormFieldControl
error. De todos modos, esto es solo una cosa más a tener en cuenta mientras estás depurando.fuente
El mismo error puede ocurrir si tiene una diapositiva de mat dentro de un campo de mat como el único elemento en mi caso que tuve
Esto podría suceder si tuviera varios atributos dentro de la
<mat-form-field>
solución simple: mover la diapositiva a la raízfuente
Puede intentar seguir esta guía e implementar / proporcionar su propio MatFormFieldControl
fuente
Accidentalmente eliminé la directiva matInput del campo de entrada que causó el mismo error.
p.ej.
código fijo
fuente
MatRadioModule no funcionará dentro de MatFormField. Los documentos dicen
fuente
En mi caso, uno de mis paréntesis de cierre para "onChanges ()" se perdió en el elemento de entrada y, por lo tanto, el elemento de entrada aparentemente no se representaba en absoluto:
fuente
Una solución parcial es envolver el campo de formulario de material en un componente personalizado e implementar el
ControlValueAccessor
interfaz en él. Además de la proyección de contenido, el efecto es prácticamente el mismo.Ver ejemplo completo en Stackblitz.
Usé
FormControl
( formas reactivas ) dentroCustomInputComponent
peroFormGroup
oFormArray
debería funcionar también si usted necesita un elemento de forma más compleja.app.component.html
custom-input.component.html
fuente
Has perdido la
matInput
directiva en tu etiqueta de entrada.fuente
fuente
Puede establecer apariencia = "relleno" dentro de su etiqueta mat-form-field, funciona para mí
fuente
appearence = "fill"
está haciendo aquí?Angular 9+ ... Material 9+
He notado que 3 errores pueden dar lugar al mismo error:
fuente
La nueva importación actualizada del módulo MatInput es:
Según la API de materiales angulares
fuente
En mi caso cambié esto:
a esto:
Agregar la directiva matInput a la etiqueta de entrada fue lo que solucionó este error para mí.
fuente
Es posible que no haya importado MatInputModule
fuente
usar proveedores en el archivo component.ts
fuente
Nota En algún momento se produce un error, cuando usamos la etiqueta "mat-form-field" alrededor del botón de envío como:
Así que amablemente no use esta etiqueta alrededor del botón Enviar
fuente
Tuve el mismo problema
el problema es simple
solo debes importar dos módulos a tu proyecto
MatFormFieldModule MatInputModule
fuente
Estaba recibiendo el mismo problema debido al elemento comentado de la siguiente manera.
¡El campo de formulario debe tener elemento! (por ejemplo, la entrada, el área de texto, select, etc.)
fuente