Элемент <mat-error>
будет отображаться только в том случае, если состояние элемента управления вводом является ошибочным (см. Этот пост: Угловой материал: ошибка в мате не отображается, несмотря на истинные методы ).Все немного сложнее, когда вы используете ngModel вместо formControl, но принцип тот же, потому что ngModel использует FormControl для внутреннего использования.
При использовании реактивных форм и FormControl проще всего было бы добавитьпользовательский валидатор для FormControl вашего ввода (и вы можете сделать это также с помощью ngModel - но это больше работы, так как вам нужно ссылаться на FormControl через ngModel, который требует использования ViewChild и т. д.).
Самый простой способ сделать этос ngModel и Angular Material просто использовать пользовательский ErrorStateMatcher для MatInput.Это обеспечит автоматическую ссылку на внутренний FormControl.Взгляните на https://material.angular.io/components/input/overview#changing-when-error-messages-are-shown.
Затем вы вызываете функцию checkSpecialCharacters из вашего ErrorStateMatcher, а не из mat-error ngIf:
import {FormControl, FormGroupDirective, NgForm, Validators} from '@angular/forms';
import {ErrorStateMatcher} from '@angular/material/core';
/** Error when invalid control is dirty, touched, or submitted. */
export class MyErrorStateMatcher implements ErrorStateMatcher {
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
const isSubmitted = form && form.submitted;
if (control && control.invalid
&& (control.touched || (form && form.submitted))) {
return true;
} else {
return !checkSpecialCharacters(control.value);
}
}
}
Обновленный компонент:
errorStateMatcher: ErrorStateMatcher = new MyErrorStateMatcher();
checkSpecialCharacters(value: string): boolean {
let valid = true;
if (value && value.length > 0) {
for (let i = 0; i < this.name.length; i++) {
if (value.charAt(i).match(/^[^a-zA-Z0-9 ]/) !== null) {
valid = false;
}
}
}
return valid;
}
HTML:
<md-input-container class="full-width" >
<input name="nombre" required [(ngModel)]="name" mdInput placeholder="Nombre" [errorStateMatcher]="errorStateMatcher">
<md-error>Se han ingresado caracteres invalidos</md-error>
</md-input-container>
Обратите внимание, что это основано на моих знаниях Angular Material 6 - я верю, что это будет хорошо и для v2.