Estamos tentando construir nossos próprios componentes de campo de formulário em nossa empresa. Estamos tentando envolver os componentes do design de material como este:
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>
caixa 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>
Isso resulta aproximadamente nisso:
<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>
Mas estou recebendo "mat-form-field deve conter um MatFormFieldControl" no console. Eu acho que isso tem a ver com mat-form-field que não contém diretamente um matInput-field. Mas está contendo, está apenas dentro da projeção de conteúdo ng.
Aqui está uma blitz: https://stackblitz.com/edit/angular-xpvwzf
angular
angular-material2
Viktor Eriksson
fonte
fonte
Respostas:
Infelizmente, a projeção de conteúdo no campo formulário não é ainda suportada. Acompanhe a seguinte edição do github para obter as últimas notícias sobre ela.
Até agora, a única solução para você é colocar seu conteúdo diretamente no componente mat-form-field ou implementar uma classe MatFormFieldControl, criando assim um componente de campo de formulário personalizado.
fonte
MatInputModule
precisa ser importado, resolveu meu problema. Como essa é a resposta aceita, estou adicionando o link aqui, esperando que ele economize o tempo de outras pessoas.<mat-form-field>
tag que você tem que ter certeza que você adicionou corretamentematInput
atributo em cadainput
tag ou oumatNativeControl
atributo em cada<select>
Eu tive esse problema. Eu importei
MatFormFieldModule
no meu módulo principal, mas esqueci de adicionarMatInputModule
àimports
matriz, assim:Espero que ajude.
Mais informações aqui .
fonte
<mat-form-field>
tag que você tem que ter certeza que você adicionou corretamentematInput
atributo em cadainput
tag ou oumatNativeControl
atributo em cada<select>
tagimport { MatInputModule } from '@angular/material/input':
Solução 1 - importar MatInputModule
importar
MatInputModule
dentro do módulo ou sejaapp.module.ts
Solução 2 - Erros de ortografia
Certifique-se de adicionar
matInput
e faz distinção entre maiúsculas e minúsculas.fonte
Citando a documentação oficial aqui :
fonte
Isso também pode acontecer se você tiver uma entrada adequada dentro de um campo de formulário mat , mas houver uma
ngIf
. Por exemplo:No meu caso,
mat-chip-list
é suposto que "apareça" somente após os dados serem carregados. No entanto, a validação é realizada emat-form-field
atende àsPara corrigi-lo, o controle deve estar lá, então eu usei
[hidden]
:Uma solução alternativa é proposta por
Mosta
: move * ngIf format-form-field
:fonte
fonte
Não tenho certeza se poderia ser tão simples, mas tive o mesmo problema, alterar "mat-input" para "matInput" no campo de entrada resolveu o problema. No seu caso, vejo "matinput" e está causando meu aplicativo com o mesmo erro.
"matinput"
"matInput"
fonte
mdInput
paramatInput
.matInput
vez demat-input
.Se alguém ficou com esse erro depois de tentar aninhar um
<mat-checkbox>
, fique de bom humor! Não funciona dentro de uma<mat-form-field>
tag.fonte
se alguém estiver tentando aninhar um
<mat-radio-group>
dentro de um<mat-form-field>
como abaixo, você receberá este erroremova as
<mat-form-field>
tags principaisfonte
mat-form-field
problema fez com que eu desaparecesse.<mat-form-field>
não suporte o grupo de rádio dentro dele? Eu também estava tendo esse problema e não pensei em remover as tags de campo do formulário, porque parecia não ser a coisa certa a fazer, já que muitos exemplos de materiais de formulário da interface do usuário usam<mat-form-field>
. Eu tenho todos os vários módulos de entrada de material para formulários, selecione listas suspensas e grupos de rádio definidos em meu app.module.ts como muitas das outras referências de respostas.Também tive esse problema e tenho um
<mat-select>
elemento no meu modelo, quando importo o MatSelectModule para o Módulo, ele funciona, não produz ciência, mas ainda espero que possa ajudá-lo.fonte
Infelizmente, não posso apenas comentar algumas respostas já boas, pois ainda não tenho os pontos SO, no entanto, existem três módulos principais que você precisará verificar para importar para o módulo pai do componente, além do que você precisa importar diretamente para o seu componente. Eu queria compartilhá-los brevemente e destacar o que eles fazem.
Os dois primeiros são para material angular. Muitas pessoas novas no Material Angular encontrarão instintivamente um desses e não perceberão que a construção de um formulário exige ambos.
Então, qual é a diferença entre eles?
MatFormFieldModule abrange todos os diferentes tipos de campos de formulário que o Material Angular tem disponível. Este é mais um módulo de alto nível para campos de formulário em geral, enquanto o MatInputModule é especificamente para tipos de campos de 'entrada', ao contrário de caixas de seleção, botões de opção etc.
O terceiro item da lista acima é o Módulo de formas reativas da Angular. O Módulo de formulários reativos é responsável por uma tonelada de amor angular oculto. Se você vai trabalhar com o Angular, eu recomendo que você gaste algum tempo lendo o Angular Docs. Eles têm todas as suas respostas. A criação de aplicativos raramente NÃO envolve formulários e, na maioria das vezes, seu aplicativo envolve formulários reativos. Por esse motivo, leia estas duas páginas.
Documentos angulares: formulários reativos
Documentos angulares: módulo de formulários reativos
O primeiro documento 'Formas reativas' será sua arma mais poderosa quando você começar, e o segundo documento será sua arma mais poderosa quando você acessar aplicativos mais avançados de Formas reativas angulares.
Lembre-se, eles precisam ser importados diretamente para o módulo do seu componente, não para o componente em que você os está usando. Se bem me lembro, no Angular 2, importamos todo o conjunto de módulos de material angular no módulo principal do aplicativo e depois importamos o que precisávamos diretamente em cada um de nossos componentes. O método atual é IMO muito mais eficiente, porque garantimos a importação de todo o conjunto de módulos de material angular, se usarmos apenas alguns deles.
Espero que isso forneça um pouco mais de insight sobre a construção de formulários com o material angular.
fonte
Se todas as respostas principais de estrutura / configuração de código acima não resolverem o seu problema, aqui está mais uma coisa para verificar: verifique se você não invalidou de alguma forma sua
<input>
tag.Por exemplo, recebi a mesma
mat-form-field must contain a MatFormFieldControl
mensagem de erro após colocar acidentalmente umrequired
atributo após uma barra de fechamento automático/
, o que invalidou efetivamente o meu<input/>
. Em outras palavras, eu fiz isso (veja o final dos atributos da tag de entrada):errado :
direito :
Se você cometer esse erro ou algo mais para invalidar o seu
<input>
, poderá receber omat-form-field must contain a MatFormFieldControl
erro. Enfim, isso é apenas mais uma coisa a ser procurada durante a depuração.fonte
O mesmo erro pode ocorrer se você tiver um slide de tapete dentro de um tapete de campo como o único elemento no meu caso
Isso pode acontecer se você tiver vários atributos na
<mat-form-field>
solução Simples: mover o slide para a raizfonte
Você pode tentar seguir este guia e implementar / fornecer seu próprio MatFormFieldControl
fonte
Eu removi acidentalmente o matInput diretiva do campo de entrada que causou o mesmo erro.
por exemplo.
código fixo
fonte
MatRadioModule não funcionará dentro do MatFormField. Os documentos dizem
fonte
No meu caso, um dos meus parênteses de fechamento para "onChanges ()" estava ausente no elemento de entrada e, portanto, o elemento de entrada aparentemente não estava sendo renderizado:
fonte
Uma solução parcial é agrupar o campo do formulário do material em um componente personalizado e implementar a
ControlValueAccessor
interface nele. Além da projeção de conteúdo, o efeito é praticamente o mesmo.Veja o exemplo completo no Stackblitz.
Eu usei
FormControl
( formas reativas ) dentro,CustomInputComponent
masFormGroup
ouFormArray
deveria funcionar também se você precisar de um elemento de formulário mais complexo.app.component.html
custom-input.component.html
fonte
Você perdeu a
matInput
diretiva na sua tag de entrada.fonte
fonte
Você pode definir a aparência = "preencher" dentro da sua tag mat-form-field, funciona para mim
fonte
appearence = "fill"
está fazendo aquiAngular 9+ ... Material 9+
Notei que 3 erros podem dar origem ao mesmo erro:
fonte
No meu caso, mudei isso:
para isso:
Adicionar a diretiva matInput à tag de entrada foi o que corrigiu esse erro para mim.
fonte
Você pode ter perdido a importação do MatInputModule
fonte
Nota Algum tempo ocorre um erro, quando usamos a tag "mat-form-field" ao redor do botão enviar, como:
Portanto, por favor, não use essa tag no botão enviar
fonte
use provedores no arquivo component.ts
fonte
A nova importação atualizada do Módulo MatInput é:
Conforme API de materiais angulares
fonte
Eu tive o mesmo problema
questão é simples
somente você deve importar dois módulos para o seu projeto
MatFormFieldModule MatInputModule
fonte
Eu estava recebendo o mesmo problema devido ao elemento comentado da seguinte forma.
campo de formulário deve ter elemento! (por exemplo, a entrada, área de texto, seleção, etc.)
fonte