Я работал над корпоративным приложением, которое управляется первичной формой и столкнулось с той же проблемой.Лучшее решение, которое я мог определить, - это обернуть все элементы управления вводом в компоненты.Затем обработка отображения проверки в компоненте.Это позволяет отображать согласованную проверку без многократного повторения кода в каждой форме.
field-input-text.component.html
<input [formControl]="formControlItem" [maxlength]="maxlength" [placeholder]="placeholder" #input>
<span *ngIf="formControlItem.invalid && (formControlItem.dirty || formControlItem.touched)" class="text-danger">
<span *ngIf="formControlItem.errors.required">This field is required</span>
<span *ngIf="formControlItem.errors.minlength">This field is too short</span>
<span *ngIf="formControlItem.errors.maxlength">This field is too long</span>
<span *ngIf="formControlItem.errors.pattern">Invalid value for this field</span>
</span>
field-input-text-component.ts
import { Component, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';
@Component({
selector: 'app-field-input-text',
templateUrl: './field-input-text.component.html'
})
export class FieldInputTextComponent implements OnInit, AfterViewInit {
@Input() formControlItem: FormControl;
@Input() maxlength: number;
@Input() placeholder: string = '';
constructor() { }
ngOnInit() {
}
}
Использование
<app-field-input-text [formControlItem]="form.controls.username" maxlength="10"></app-field-input-text>
В процессе использования вы можете видеть экономию места без необходимости в дополнительныхпроверочные строки.Вы также можете переформатировать всю проверку в одном месте вместо того, чтобы касаться каждой области.
Основным недостатком является невозможность использования атрибутов formControl или formControlName.Я попытался создать пользовательский компонент ControlValueAccessor, но это не помогло с отображением проверки.
Я нашел ваш вопрос в поиске, чтобы узнать, нашел ли кто-нибудь другой лучший способ.Я знаю, что этот ответ немного запоздал, но, надеюсь, он поможет.