我正在尝试访问本机元素,以便在单击另一个元素时关注它(非常类似于html属性“for” – 因为不能在此类型的元素上使用.
但是我收到错误:
TypeError: Cannot read property ‘nativeElement’ of undefined
我尝试在ngAfterViewInit()中的console.log中使用nativeElement,以便加载但仍然会抛出错误.
我还在click事件处理程序中访问nativeElement,这样我可以在单击另一个元素时聚焦元素 – 这可能是什么问题,因为它在视图加载之前编译?
例如:
ngAfterViewInit() { console.log(this.keywordsInput.nativeElement); // throws an error } focusKeywordsInput(){ this.keywordsInput.nativeElement.focus(); }
完整代码:
正在使用的html模板的相关部分:
<div id="keywords-button" class="form-group" (click)="focusKeywordsInput()"> <input formControlName="keywords" id="keywords-input" placeholder="KEYWORDS (optional)"/> <div class="form-control-icon" id="keywords-icon"></div> </div>
component.ts:
import { Component,OnInit,AfterViewInit,ViewChild,ElementRef } from '@angular/core'; import { REACTIVE_FORM_DIRECTIVES,FormGroup,FormBuilder,Validators,ControlValueAccessor } from '@angular/forms'; import { NumberPickerComponent } from './number-picker.component'; import { DistanceUnitsComponent } from './distance-units.component'; import { MapDemoComponent } from '../shared/map-demo.component'; import { AreaComponent } from './area-picker.component'; import { GoComponent } from './go.component'; import { HighlightDirective } from '../highlight.directive'; @Component({ selector: 'find-form',templateUrl: 'app/find-page/find-form.component.html',styleUrls: ['app/find-page/find-form.component.css'],directives: [REACTIVE_FORM_DIRECTIVES,NumberPickerComponent,DistanceUnitsComponent,MapDemoComponent,AreaComponent,GoComponent] }) export class FindFormComponent implements OnInit,AfterViewInit { findForm: FormGroup; submitted: boolean; // keep track on whether form is submitted events: any[] = []; // use later to display form changes @ViewChild('keywords-input') keywordsInput; //comment constructor(private formBuilder: FormBuilder,el: ElementRef) {} ngOnInit() { this.findForm = this.formBuilder.group({ firstname: ['',[ Validators.required,Validators.minLength(5) ] ],lastname: ['',Validators.required],keywords: [],area: ['',address: this.formBuilder.group({ street: [],zip: [],city: [] }) }); this.findForm.valueChanges.subscribe(data => console.log('form changes',data)); } ngAfterViewInit() { console.log(this.keywordsInput.nativeElement); // throws an error } focusKeywordsInput(){ this.keywordsInput.nativeElement.focus(); } save(isValid: boolean) { this.submitted = true; // check if model is valid // if valid,call API to save customer console.log(isValid); } }
完整的HTML模板(可能不相关):
<form class="text-uppercase" [formGroup]="findForm" (ngSubmit)="save(findForm.value,findForm.valid)"> <div class="row is-heading"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group"> <h2 class="search-filter-heading heading m-x-auto">find vegan</h2> </div> </div> <div class="row has-error-text"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group btn-group" style="height:64px;"> <div style="position: relative; display: inline-block; width: 100%;"> <multiselect #multiselect></multiselect> </div> </div> </div> <div class="row error-text" [style.display]="multiselect.selectedCategories.length < 1 && submitted ? 'block' : 'none'"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 form-group input-group btn-group"> <small>Please select at least 1 category.</small> </div> </div> <div class="row is-heading"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group"> <h2 class="search-filter-heading heading m-x-auto">within</h2> </div> </div> <div class="row"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group btn-group" style="height:64px;"> <div style="position: relative; display: inline-block;"> <number-picker #numberPicker></number-picker> </div> <distance-units></distance-units> </div> </div> <div class="row is-heading"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group"> <h2 class="search-filter-heading heading m-x-auto">of</h2> </div> </div> <div class="row has-error-text"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group btn-group" style="height:64px;"> <div style="position: relative; display: inline-block; width: 100%;"> <my-area></my-area> </div> </div> </div> <div class="row error-text" [style.display]="multiselect.selectedCategories.length < 1 && submitted ? 'block' : 'none'"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 form-group input-group btn-group"> <small [hidden]="findForm.controls.firstname.valid || (findForm.controls.firstname.pristine && !submitted)">Please enter an area.</small> </div> </div> <div class="row is-heading"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group"> <h2 class="search-filter-heading heading m-x-auto">keywords</h2> </div> </div> <div class="row form-group"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group btn-group" style="height:64px;"> <div style="position: relative; display: inline-block; width: 100%;"> <div id="keywords-button" class="form-group" (click)="focusKeywordsInput()"> <input formControlName="keywords" id="keywords-input" placeholder="KEYWORDS (optional)"/> <div class="form-control-icon" id="keywords-icon"></div> </div> </div> </div> </div> <div class="row"> <div class="col-sm-8 offset-sm-2 col-md-6 offset-md-3 col-lg-4 offset-lg-4 input-group btn-group" style="height:64px;"> <div style="position: relative; display: inline-block; width: 100%;"> <go></go> </div> </div> </div> </form>
@ViewChild(‘keywords-input’)keywordsInput;与id =“keywords-input”不匹配
id="keywords-input"
应该是模板变量:
#keywordsInput
请注意,应使用驼峰大小写,因为 – 模板引用名称中不允许使用.
@ViewChild('keywordsInput') keywordsInput;
或组件或指令类型:
@ViewChild(MyKeywordsInputComponent) keywordsInput;
另见https://stackoverflow.com/a/35209681/217408
暗示:在调用ngAfterViewInit()之前未设置keywordsInput