ПРИМЕЧАНИЕ когда мы создаем пользовательский элемент управления формы, Angular добавляет ng-invalid ng-touch в наш компонент. Итак, в целом мы меняем внешний вид нашего элемента управления, используя .css
.ng-invalid.ng-touched
{
color:red;
}
Проблема в том, что мы хотим изменить внешний вид ввода матов внутри нашего пользовательского элемента управления формы. Поэтому нам нужно знать, когда недействителен наш контроль.
в этот стек у вас есть свой пользовательский элемент управления формой.
Ключ знает, когда ваш пользовательский элемент управления формы недействителен. Для этого можно ввести ngControl. Необходимо использовать инъекцию, чтобы избежать циклической зависимости. Итак, наш конструктор это как
constructor(public injector: Injector) { }
ngOnInit() {
this.ngControl = this.injector.get(NgControl);
this.fm.valueChanges.subscribe(v => {
this.onChange(v);
})
}
Ну, мы знаем, когда пользовательский элемент управления действителен, тронут, нетронут ...
Мы собираемся определить .css как
.customError,.custom
{
display:inline-block;
}
.customError .mat-form-field-empty.mat-form-field-label {
color: red!important;
}
.customError .mat-form-field-underline {
background-color: red!important;
}
И используйте ViewEncapsulation.None в нашем компоненте. ViewEncapsulation.None не делает .css во всех приложениях. Это объясняется тем, что мы добавляем класс «.customError» перед .mat-form-field-empty.mat-form-field-label и mat-form-field-underline. В остальном ВСЕ наши компоненты для матов имеют ошибку.
@Component({
selector: 'app-a',
templateUrl: './a.component.html',
styleUrls: [ './a.component.css' ],
encapsulation:ViewEncapsulation.None,
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AComponent),
multi: true
}]
})
После этого мы используем [ngClass] для добавления классов
<div class="custom"
[ngClass]="{'customError':ngControl.invalid && ngControl.touched}" >
<mat-form-field
[color]="ngControl.invalid && ngControl.touched?'warn':null" >
<input matInput placeholder="Some value" [formControl]="fm" (blur)="onTouched()">
</mat-form-field>
</div>
Обратите внимание, что мы используем свойство [color] в поле mat-form-field, чтобы подчеркивание ряби стало красным, и как мы используем (размытие), чтобы пометить как прикосновение к элементу управления