Попробуйте следующее:
<input #Custom *ngIf="controlName === 'confirmPassword'; else Default" matInput [placeholder]="placeholder" [formControlName]="controlName" [type]="showPassword ? 'text' : 'password'" [autocomplete]="autocomplete" [errorStateMatcher]="errorMatcher"/>
<ng-template #Default>
<input matInput [placeholder]="placeholder" [formControlName]="controlName" [type]="showPassword ? 'text' : 'password'" [autocomplete]="autocomplete"/>
</ng-template>
РЕДАКТИРОВАТЬ
В двух словах это, вероятно, сводится к дочернему шаблону с использованием родительского значения, которое было изменено после дочернего.оказано.Это обычно происходит, когда дочерние элементы отрисовываются до того, как родительский объект завершает рендерингСначала я думал, что это связано с тем фактом, что вы поместили директиву errorStateMatcher в дочерний шаблон.
Посмотрите на следующую статью, так как она объясняет проблему лучше, чем я, и также рассматриваются некоторые общие шаблоны, которыевызвать проблему и как изменить их, чтобы исправить:
https://blog.angularindepth.com/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error-e3fd9ce7dbb4
РЕДАКТИРОВАТЬ
Исходя из ваших комментариев, возможно, чтоДиректива ngIf конфликтует с директивой matInput.Можете ли вы попробовать следующее:
<ng-container *ngIf="controlName === 'confirmPassword'; else Default">
<input #Custom matInput [placeholder]="placeholder" [formControlName]="controlName" [type]="showPassword ? 'text' : 'password'" [autocomplete]="autocomplete" [errorStateMatcher]="errorMatcher"/>
</ng-container>
<ng-template #Default>
<input matInput [placeholder]="placeholder" [formControlName]="controlName" [type]="showPassword ? 'text' : 'password'" [autocomplete]="autocomplete"/>
</ng-template>
Ниже приведен рабочий пример этого: Пример StackBlitz