我正在使用带有angular2的模板表单组件,在提交表单后,我无法在我的firstName输入元素中设置焦点。表单重新设置正常但无法设置焦点。
这是我的组件代码:
export class TemplateFormComponent {
@ViewChild('f') form: any;
onSubmit() {
if (this.form.valid) {
console.log("Form Submitted!");
this.form.reset();
this.form.controls.firstName.focus();
}
}
}
和我的模板代码:
<form novalidate autocomplete="off" #f="ngForm" (ngSubmit)="onSubmit()">
<div class="form-group">
<label>First Name</label>
<input type="text"
class="form-control"
name="firstName"
[(ngModel)]="model.firstName"
required
#firstName="ngModel">
</div>
</form>
答案 0 :(得分:11)
在您的视图中,设置对要关注的输入字段的引用(您已经拥有#firstName
)。
然后,在组件代码上,使用@ViewChild创建对它的访问:
@ViewChild('firstName') firstNameRef: ElementRef;
最后,在重置表单后:
this.firstNameRef.nativeElement.focus()
ps。:我希望FormControl api公开一个焦点方法,但是this issue on gitHub表明它可能永远不会发生。
答案 1 :(得分:0)
有关更通用的解决方案,请参见
Is it possible to get native element for formControl? `
@Directive({
selector: '[ngModel]',
})
export class NativeElementInjectorDirective {
constructor(private el: ElementRef, private control : NgControl) {
(<any>control.control).nativeElement = el.nativeElement;
}
}
`
将指令添加到模块后,这会将nativeElement添加到EACH表单控件中。
更新:此用例的更简单解决方案 若要将注意力集中在表单上的第一个无效元素上,请创建如下指令:
import { Directive, HostListener, ElementRef} from '@angular/core';
@Directive({
selector: '[focusFirstInvalidField]'
})
export class FocusFirstInvalidFieldDirective {
constructor(private el: ElementRef) { }
@HostListener('submit')
onFormSubmit() {
const invalidElements = this.el.nativeElement.querySelectorAll('.ng-invalid');
if (invalidElements.length > 0) {
invalidElements[0].focus();
}
}
}
然后只需将其添加到表单元素标签
答案 2 :(得分:0)
简单的解决方案:将“自动对焦”添加到您的输入元素属性中。
<input type="text" class="form-control" name="firstName" autofocus required>