Если вы используете материальные модули Angular, вы могли столкнуться с ошибкой mat-form-field must contain a MatFormFieldControl
при использовании MatFormFieldModule
.
Эта ошибка возникает, когда вы не добавили элемент управления полем формы в поле формы.
что такое элементы управления полем формы?
Такие элементы, как <input>
или <textarea>
, которые размещаются внутри mat-form-field
, являются элементами управления полями формы
Если ваш mat-form-field
содержит <input>
или <textarea>
элемент, убедитесь, что вы добавили к нему директиву matInput
и импортировали MatInputModule
, в противном случае вы получите ошибку mat-form-field must contain a MatFormFieldControl
в вашем приложении.
Другие компоненты, которые могут выступать в качестве элементов управления полем формы, включают в себя <mat-select>
, <mat-chip-list>
и любые пользовательские элементы управления полем формы, которые вы создали.
Исправление ошибки mat-form-field must contain a MatFormFieldControl
.
Чтобы исправить ошибку, добавьте MatInputModule
и MatFormFieldModule
внутрь необходимого модуля или app.module.ts
Или, как объясняется в Angular material tutorial, добавьте все модули материалов в общий модуль и добавьте его в файл app.module.ts
, чтобы мы могли использовать их во всем приложении
import { MatInputModule } from '@angular/material/input';
import { MatFormFieldModule } from "@angular/material/form-field";
@NgModule({
imports: [
MatFormFieldModule,
MatInputModule
]
})
export class AppModule { }
Далее убедитесь, что вы добавили директиву matInput
в элемент управления mat-form-field
.
<mat-form-field appearance="fill">
<mat-label>Input</mat-label>
<input placeholder="Name">
</mat-form-field>
Приведенный выше код выдает ошибку, потому что мы не добавили директиву matInput
.
<mat-form-field appearance="fill">
<mat-label>Input</mat-label>
<input matInput placeholder="Name">
</mat-form-field>
А matInput
чувствительна к регистру
Поэтому, если у вас есть орфографическая ошибка в matInput
или заглавные (MatInput
) или строчные (matinput
) буквы в matInput
, вы все равно столкнетесь с ошибкой.
<mat-form-field appearance="fill">
<mat-label>Input</mat-label>
<input matinput placeholder="Name">
</mat-form-field>
mat-form-field
управляющий ввод не должен содержать *ngIf
Если вы используете *ngIf
в элементе управления mat-form-field, то есть, <input>
тег, вы получите ошибку mat-form-field must contain a MatFormFieldControl
.
Приведенный ниже код не будет работать.
<mat-form-field>
<mat-label>Input</mat-label>
<input matInput *ngIf="condition"/>
</mat-form-field>
Вместо этого следует использовать *ngIf
на элементе mat-form-field
.
<mat-form-field *ngIf="condition">
<mat-label>Input</mat-label>
<input matInput />
</mat-form-field>
Резюме
Чтобы исправить ошибку mat-form-field must contain a MatFormFieldControl
, выполните следующие действия
- Импортируйте
MatInputModule
иMatFormFieldModule
- Добавьте директиву
matInput
к элементу управленияmat-form-field
. т.е.input
илиtextarea
- Проверьте орфографию
matInput
. - Не используйте
*ngIf
в элементе управленияmat-form-field
, вместо этого используйте его в элементеmat-form-field