Angular 的模版引用变量就是在模版中使用 # 将 DOM 元素(同样适用于组件)声明一个变量。

我习惯叫它井号语法,有很多用法,这里给出我写的一些示例。

拿到 input 的值填入

<input #newItem (keyup.enter)="addItem(newItem.value); newItem.value = ''" />

ngIf 的 else 块

<h2>
  {{ items.length }}
  <span *ngIf="items.length === 1; else elseBlock">item</span>
  <ng-template #elseBlock>items</ng-template>
</h2>

操作 DOM

此处功能是双击显示编辑框后,自动聚焦。

<input #editInput />

使用 @ViewChild 装饰器获取模版变量的引用,从而访问和操作 DOM:

export class AppComponent {
  @ViewChild("editInput", { static: false }) editInput: ElementRef<HTMLInputElement>
 
  editTodo(todo: Todo) {
    // ....
 
    // 通过 nativeElement 属性访问 DOM 并聚焦
    // 因为双击后才会显示编辑框,所以使用 setTimeout 等待 DOM 渲染完成
    setTimeout(() => this.editInput.nativeElement.focus())
  }
}