1 | import {
|
---|
2 | AfterViewInit,
|
---|
3 | ComponentFactoryResolver,
|
---|
4 | ComponentRef,
|
---|
5 | ContentChild,
|
---|
6 | Directive,
|
---|
7 | ElementRef,
|
---|
8 | Renderer2,
|
---|
9 | ViewContainerRef
|
---|
10 | } from '@angular/core';
|
---|
11 | import { NgControl } from '@angular/forms';
|
---|
12 | import { MatFormField } from '@angular/material/form-field';
|
---|
13 | import { MatSelect } from '@angular/material/select';
|
---|
14 | import { FormErrorComponent } from '../components/generic/form-error/form-error.component';
|
---|
15 |
|
---|
16 | @Directive({
|
---|
17 | selector: '[appHandleSelectFormErrors]'
|
---|
18 | })
|
---|
19 | export class HandleSelectFormErrorsDirective implements AfterViewInit {
|
---|
20 | private errorComponent: ComponentRef<FormErrorComponent>;
|
---|
21 | private control!: NgControl | null;
|
---|
22 | @ContentChild(MatSelect, { read: ElementRef }) controlElementRef!: ElementRef;
|
---|
23 |
|
---|
24 | constructor(
|
---|
25 | private vcr: ViewContainerRef,
|
---|
26 | private resolver: ComponentFactoryResolver,
|
---|
27 | private formField: MatFormField,
|
---|
28 | private renderer: Renderer2
|
---|
29 | ) {
|
---|
30 | const factory = this.resolver.resolveComponentFactory(FormErrorComponent);
|
---|
31 | this.resolver.resolveComponentFactory(FormErrorComponent);
|
---|
32 | this.errorComponent = this.vcr.createComponent(factory);
|
---|
33 | }
|
---|
34 |
|
---|
35 | public ngAfterViewInit(): void {
|
---|
36 | this.control = this.formField._control.ngControl;
|
---|
37 | this.renderer.listen(this.controlElementRef.nativeElement, 'blur', () => this.onChange());
|
---|
38 | this.formField?._control?.ngControl?.statusChanges?.subscribe(() => this.onChange());
|
---|
39 | }
|
---|
40 |
|
---|
41 | private onChange(): void {
|
---|
42 | this.errorComponent.instance.errors = this.control?.errors;
|
---|
43 | }
|
---|
44 | }
|
---|