formgroup formcontrolname formcontrol form example disabled control angular angular2-forms

angular - formcontrolname - ¿Es posible obtener elemento nativo para formControl?



formcontrol set value angular 6 (3)

El código a continuación no funciona con el enlace de ngModel puro, así que hice muchos experimentos. Lo último, también confirmado por Maximillian Schwarzmuller debería ser el siguiente:

@Directive({ selector: ''[ngModel]'', // or ''input, select, textarea'' - but then your controls won''t be handled and also checking for undefined would be necessary }) export class NativeElementInjectorDirective { constructor(private el: ElementRef, private control : NgControl) { (<any>control.control).nativeElement = el.nativeElement; } }

Por lo tanto, si esta directiva se proporciona y se exporta en el módulo principal, adjuntará una propiedad nativa de Elemento personalizada a todos los FormControl .

Es una pena que no salga de la caja ...

Tengo forma reactiva Angular2. formControl y lo formControl a los campos de entrada mediante [formControl]=... Según tengo entendido, crea el nativeElement <-> formControl .

Mi pregunta: ¿es posible obtener nativeElement para formControl ? Quiero hacer algo como myFormControl.nativeElement.focus()


Puedo compartir una solución terrible pero funciona para mí.

En formas reactivas podemos utilizar cualquiera

1) FormControlDirective

ts

myControl = new FormControl('''')

modelo

<input type="text" [formControl]="myControl">

o

2) FormControlName

ts

myForm: FormGroup; constructor(private fb: FormBuilder) {} ngOnInit() { this.myForm = this.fb.group({ foo: '''' }); }

modelo

<form [formGroup]="myForm"> <input type="text" formControlName="foo"> </form>

Así que para estas directivas podría escribir un parche como

1) FormControlDirective

const originFormControlNgOnChanges = FormControlDirective.prototype.ngOnChanges; FormControlDirective.prototype.ngOnChanges = function() { this.form.nativeElement = this.valueAccessor._elementRef.nativeElement; return originFormControlNgOnChanges.apply(this, arguments); };

2) FormControlName

const originFormControlNameNgOnChanges = FormControlName.prototype.ngOnChanges; FormControlName.prototype.ngOnChanges = function() { const result = originFormControlNameNgOnChanges.apply(this, arguments); this.control.nativeElement = this.valueAccessor._elementRef.nativeElement; return result; };

Después de eso podemos acceder fácilmente al elemento nativo que tiene la instancia de FormControl

1) FormControlDirective

focusToFormControl() { (<any>this.myControl).nativeElement.focus(); }

2) FormControlName

focusToFormControlName(name) { (<any>this.myForm.get(name)).nativeElement.focus(); }

Ejemplo de Plunker


Se ha agregado una solución menor a la respuesta de baHI (la lógica se movió a OnInit). El error mencionado en los comentarios probablemente esté relacionado con cambios en los formularios. Esta respuesta es para "@ angular / forms": "~ 7.1.0",

@Directive({ selector: ''[ngModel]'' }) export class NativeElementInjectorDirective implements OnInit { constructor (private el: ElementRef, private control : NgControl) {} ngOnInit(){ (this.control.control as any).nativeElement = this.el.nativeElement; } }