Компонент <mat-error>
нуждается в ErrorStateMatcher
для отображения чего-либо. Здесь есть хорошая статья об этом; https://itnext.io/materror-cross-field-validators-in-angular-material-7-97053b2ed0cf
Короче говоря, вам нужно указать [errorStateMatcher]="myErrorStateMatcher"
в проверяемом поле формы.
<mat-form-field>
<input matInput type="text" [(ngModel)]="contact.info" required
[errorStateMatcher]="myErrorStateMatcher">
<mat-error *ngIf="contactInfoValid(contact) == false">
email not correct
</mat-error>
</mat-form-field>
Обычно ErrorStateMatcher работает с FormControls, но Если вы хотите использовать ngModel, вы можете предоставить собственный ErrorStateMatcher, у которого есть доступ к нужным вам данным для отображения сообщений об ошибках. Ниже приведен упрощенный пример этого:
export class RuleErrorStateMatcher<T> implements ErrorStateMatcher {
constructor(private editControl: IValidatableEditControl<T>) { }
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
return this.editControl && this.editControl.model && !this.editControl.model.isValid;
}
}
export interface IValidatableEditControl<T> {
model: ValidationGeneric<T>;
}
export class ValidationGeneric<T> {
public value: T;
public isValid: boolean;
}
Если вы попробуете другой тег html, чем mat-error, вы увидите, что ваш ngIf, вероятно, работает;
<span *ngIf="contactInfoValid(contact) == false">
email not correct
</span>