Я хотел бы создать общую пользовательскую форму ввода для использования внутри угловых реактивных форм. Моей целью было бы добиться того же поведения, что и в форме углового материала. Входные данные о всплывающей подсказке.
Я создал компонент, который благодаря transclusion станет родителем / оболочкой для простого поля ввода. В настоящий момент метка всплывающей подсказки отображается над полем ввода, когда пользователь начинает вводить какой-то текст, но я бы хотел, чтобы он был в фокусе. Проблема в том, что я не могу найти способ сосредоточиться на внутреннем ребенке.
Кроме того, я хотел бы отображать сообщения об ошибках формы внутри родительского компонента, поэтому мне не придется повторять их каждый раз, когда поле ввода используется в форме. Стоит ли в этом случае создавать пользовательский компонент сообщения об ошибке, получающий форму ввода в качестве входных данных и отображающий сообщения об ошибках, если таковые имеются?
шаблон
<div class="form-element" #inputContainer>
<ng-content></ng-content>
<label *ngIf="label" [ngClass]="{'label-show': showLabel}">{{label}}</label>
</div>
компонент
export class FormContainerComponent implements AfterViewInit {
showLabel = true;
isError = false;
@Input()
label: string;
@ViewChild('inputContainer')
el: ElementRef;
@HostListener('focus', ['$event.target'])
onFocus(target) {
// This does not work
}
ngAfterViewInit() {
const input = this.el.nativeElement.childNodes[0] as HTMLInputElement;
// Code below temporary, the goal would be trigger on input field focus
setTimeout(() => {
this.showLabel = !!input.value;
});
const x = fromEvent(input, 'keyup')
.pipe(map((e: any) => e.target.value))
.subscribe(value => (this.showLabel = !!value));
}
}
И компонент будет использоваться так:
<form-container [label]="'Street'">
<!-- This is the input that onFocus should trigger the label -->
<input type="text" formControlName="street" placeholder="street" [ngClass]="{ 'error': ctrls.strasse.errors && (ctrls.strasse.touched || submitted) }">
<!-- I would like to avoid having to repeat thos error messages for each input form and embed in the component -->
<span class="error-label" *ngIf="hasError('street', 'required')">
</span>
</myh-form-container>