Я пробовал это раньше - MatFormField получает MatError
s через ContentChildren
. Поскольку это проекция контента, динамическое добавление или удаление таких элементов, как MatError
, не работает - шаблон контента компилируется и обрабатывается иначе, чем другие шаблоны.
Вы упомянули в комментарии, который пытаетесь обработатьсогласованный обмен сообщениями об ошибках по шаблонам ... почему бы не добавить directive
к элементу <mat-error>
, который управляет обменом сообщениями об ошибках на основе состояния проверки формы родительского элемента управления?
Если вы 'Тем не менее, вы хотите управлять шаблонами, но вы не можете использовать директиву. Однако вы можете создать компонент и использовать как директиву:
@Component({
selector: '[matErrorMessages]',
template: '{{ error }}'
})
export class MatErrorMessagesDirective implements AfterViewInit {
public error = '';
private inputRef: MatFormFieldControl<MatInput>;
constructor(private _inj: Injector) { }
public ngAfterViewInit() {
// grab reference to MatFormField directive, where form control is accessible.
let container = this._inj.get(MatFormField);
this.inputRef = container._control;
// sub to the control's status stream
this.inputRef.ngControl.statusChanges.subscribe(this.updateErrors);
}
private updateErrors = (state: 'VALID' | 'INVALID') => {
if (state === 'INVALID') {
// active errors on the FormControl
let controlErrors = this.inputRef.ngControl.errors;
// just grab one error
const firstError = Object.keys(controlErrors)[0];
if(firstError === 'required')
this.error = 'This field is required.';
if(firstError === 'minlength')
this.error = 'This field should be longer.';
if(firstError === 'error from my own custom validator')
this.error = 'You get the point.';
// .....
}
}
затем в шаблоне ....
<mat-error matErrorMessages></mat-error>
Таким образом, выпусть MatFormField
контролирует наличие MatError
, как это должно быть, но вы контролируете content элемента error локальным, чистым способом.
stackblitzвыше: https://stackblitz.com/edit/angular-sjkfft
Вы должны покопаться в закрытых членах компонентов Material, что является сомнительной практикой и может порвать с обновлениями библиотеки, но это работает.
У меня действительно есть репозиторий для этого типа сообщений об ошибках, который был написан для гораздо более старой версии @ angular / material, но я также смог взять в руки сам Validator
для лучшего обмена сообщениями об ошибках. и вводил в модуль целый список пользовательских валидаторов / ошибок для этого валидатора: https://github.com/joh04667/material-error-messages