Angular2:尝试使用 @ViewChild 注释将焦点设置到输入字段时出现未定义的错误

Posted

技术标签:

【中文标题】Angular2:尝试使用 @ViewChild 注释将焦点设置到输入字段时出现未定义的错误【英文标题】:Angular2: undefined errors when trying to set focus to an input field using @ViewChild annotation 【发布时间】:2017-08-19 21:41:03 【问题描述】:

我有一个输入字段,当我的视图以下列方式加载时,我将其设置为焦点:

ngAfterViewInit() 
        this.focusInput.nativeElement.focus();      
    

这在 ngAfterViewInit() 函数中可以正常工作,但是当我尝试在视图的另一部分中执行此操作时,单击按钮时出现异常,指出 focusInput 未定义。在阅读了一下之后,似乎 ngIf 可能是导致此问题的原因,因为包含输入字段#focusInput 的视图部分使用 ngIf 显示或隐藏。有什么方法可以使用 ngOnChanges() 或其他任何方法检查 #focusInput 输入字段是否当前显示以及是否将其设置为焦点?

【问题讨论】:

尝试使用setter ***.com/questions/42534524/… @yurzui 我不完全明白。所以我可以在使用 setter 函数设置焦点之前设置对该 html 输入字段的引用? 创建演示您的问题的 plunker。正如你所说,你使用ngIf。这就是为什么当 ngIf 返回 false 时您的引用为 null 的原因。 setter 将帮助您识别引用是否未定义 问题是当我尝试设置焦点时,该元素会显示出来,因此无济于事。它似乎只在 ngAfterViewInit() 中定义。有没有办法让我使用设置器重新初始化它,所以它不是未定义的?hel 在setter中你会得到价值。如果它不是未定义的,你可以设置焦点 【参考方案1】:

最简单的解决方案是编写自定义焦点属性指令。这很有帮助:

How to move focus on form elements the Angular way

【讨论】:

【参考方案2】:

当您的模板中有 ngIfngFor 指令并且您的输入无法链接到您在您的内部添加的 focusInput 属性时,就会发生这种情况班级。而是使用此代码:

<input type="text" #myInput />
 myInput.focus() 

只需在模板内输入后添加 myInput.focus()

【讨论】:

【参考方案3】:

我知道现在回答你的问题已经很晚了。如果您想在任何点击或查看更改后获得焦点,因此您需要调用更改检测器。 您可以在视图更改或单击后通过调用 detectchanges() 调用更改检测。

`constructor(private detRef:ChangeDetectorRef) 
  @ViewChild('name_input') input: ElementRef;

    private buttonClick(): void 
      this.detRef.detectChanges();
      this.input.nativeElement.focus();
    `

希望这会有所帮助。

【讨论】:

以上是关于Angular2:尝试使用 @ViewChild 注释将焦点设置到输入字段时出现未定义的错误的主要内容,如果未能解决你的问题,请参考以下文章

viewChild如何获取angular2中用js添加的元素?

Angular2 - 将 div 添加到 DOM

Angular 2+:获取@ViewChild() 的子元素

angular2“不是已知元素”错误:一切都已尝试

Angular2 动态组件

Angular2 数组对象