Is it possible to get native element for formControl?

匿名 (未验证) 提交于 2019-12-03 01:10:02

问题:

I've got Angular2 reactive form. I created formControls and assigned it to input fields by[formControl]=.... As I understand it creates nativeElement <-> formControl link.

My question: is it possible to get nativeElement for formControl? I wanna do something like myFormControl.nativeElement.focus()

回答1:

I can share one terrible solution but it works for me.

In reactive forms we can use either

1) FormControlDirective

ts

myControl = new FormControl('') 

template

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

or

2) FormControlName

ts

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

template

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

So for these directives i could write some patch like

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; }; 

After that we can easily access to native element having FormControl instance

1) FormControlDirective

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

2) FormControlName

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

Plunker Example



回答2:

The code below does not work with pure ngModel binding, so I did a lot of experiments. Latest, also confirmed by Maximillian Schwarzmuller should be the one:

@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;     } } 

So if this directive is provided and exported in the main module, it will attach a custom nativeElement property to all FormControl.

It's a shame it's not coming out-of-the box...



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!