在 Angular 7+ 上使用 Enter 键移动到 ng-template 下的下一个字段

Using Enter key to move to the next field under ng-template on Angular 7+

提问人:Sakib 提问时间:8/29/2023 更新时间:8/29/2023 访问量:50

问:

我得到以下信息:Cannot read properties of undefined (reading 'focus')

因此,我控制台记录了nextField.nativeElement ,使用console.log(nextField.nativeElement)并未定义

我的 .html 文件:

<ng-template #myTemplate>
  <table>
    <tr>
      <td>
        <input (keydown.enter)="onEnterPressed($event, input2)" #input1 />
      </td>
    </tr>
    <tr>
      <td>
        <input #input2 />
      </td>
    </tr>
  </table>
</ng-template>  

我的.ts文件:

import { Component, ViewChild, ElementRef } from '@angular/core';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html',
})
export class YourComponent {
  @ViewChild('input1') input1: ElementRef;
  @ViewChild('input2') input2: ElementRef;

  onEnterPressed(event: KeyboardEvent, nextField: ElementRef): void {
    if (event.key === 'Enter') {
      event.preventDefault(); 

      nextField.nativeElement.focus();
    }
  }
} 

我期待当我的鼠标指针进入 input1 时,我使用键盘点击“Enter”键,它将移动到 input2。

角度 焦点 指令 Enter

评论

0赞 SO is full of Monkeys 8/29/2023
我假设既然您在 ng-template 中,您有条件地显示它。在这种情况下,您需要添加一个静态标志。@ViewChild('input1', {static: false}) input1: ElementRef;
1赞 Eliseo 8/29/2023
@SOisfullofMonkeys,由于缺陷,在 Angular 中,所有的 ViewChilds 都是static:false
0赞 SO is full of Monkeys 8/30/2023
@Eliseo Angular 9 之后是正确的。他有 Angular 7+,所以我认为这可能是问题所在

答:

0赞 Eliseo 8/29/2023 #1

小心!!! 使用 ViewChild(或 ViewChildren)时,你会得到一个 ElementRef (1)

@ViewChild('input1') input1: ElementRef;

但是当您在 .html 中使用模板引用变量时,一个HTMLElement

<!--as you use input2, you pass an HTMLElement-->
<input (keydown.enter)="onEnterPressed($event, input2)" #input1 />
<input #input2 />
//e.g.
{{input2.value}}

  //see that received as argument an "Event" and an HTMLElement
  onEnterPressed(event: Event, nextField: HTMLElement): void {
    if ((event as KeyboardEvent).key === 'Enter') {
      event.preventDefault(); 

      nextField.focus();
    }
  }

(1)当模板引用变量应用于HTML标签时,如果你在一个组件中使用模板引用变量就是这个组件,如果html标签有一个指令,我们可以用“exportAs”

<div my-directive #templateRef="MyDirective">