我有一个元素为<p>的组件.(click)号赛事会把它改成<textarea>号.因此,用户可以编辑数据.我的问题是:

  • 我怎样才能把重点放在textarea人身上?
  • 如何获取元素,以便对其应用.focus()
  • 我可以避免使用document.getElemenntById()吗?

我try 使用"ElementRef"和"@ViewChild()",但似乎遗漏了一些东西:

app.component.ts

@ViewChild('tasknoteId') taskNoteRef:ElementRef;

noteEditMode: boolean = false;

get isShowNote (){
  return  !this.noteEditMode && this.todo.note  ? true : false;
}
taskNote: string;
toggleNoteEditMode () {
  this.noteEditMode = !this.noteEditMode; 
  this.renderer.invokeElementMethod(
    this.taskNoteRef.nativeElement,'focus'
  );
}

app.component.html

<span class="the-insert">
  <form [hidden]="!noteEditMode && todo.note">
    <textarea #tasknoteId id="tasknote"
     name="tasknote"
     [(ngModel)]="todo.note"
     placeholder="{{ notePlaceholder }}"
     style="background-color:pink"
     (blur)="updateNote()" (click)="toggleNoteEditMode()"
     [autofocus]="noteEditMode"
     [innerHTML]="todo.note">
   </textarea>
 </form>
</span>

推荐答案

使用100#101,如图所示,

<textarea  #someVar  id="tasknote"
                  name="tasknote"
                  [(ngModel)]="taskNote"
                  placeholder="{{ notePlaceholder }}"
                  style="background-color: pink"
                  (blur)="updateNote() ; noteEditMode = false " (click)="noteEditMode = false"> {{ todo.note }} 

</textarea>
 

在组件中,

import {ElementRef} from '@angular/core';
@ViewChild('someVar') el:ElementRef;

ngAfterViewInit()
{
   this.el.nativeElement.focus();
}

#OLD Way
import {ElementRef} from '@angular/core';
@ViewChild('someVar') el:ElementRef;
    
constructor(private rd: Renderer) {}
ngAfterViewInit() {
    this.rd.invokeElementMethod(this.el.nativeElement,'focus');
}

**Updated on 22/03(March)/2017** #NEW Way

请注意,从Angular v4.0.0-rc.3 (2017-03-10)开始,几乎没有什么变化.

打破变化

从4.0 rc开始.1:

rename RendererV2 to Renderer2
rename RendererTypeV2 to RendererType2
rename RendererFactoryV2 to RendererFactory2

import {ElementRef,Renderer2} from '@angular/core';
@ViewChild('someVar') el:ElementRef;

constructor(private rd: Renderer2) {}

ngAfterViewInit() {
      console.log(this.rd); 
      this.el.nativeElement.focus();      //<<<=====same as oldest way
}

100将给出以下方法,你可以看到101不存在.Attaching img as yet it is not documented.

NOTE:您可以使用100的以下方法(带/不带ViewChild variable)来做这么多事情.

enter image description here

Angular相关问答推荐

Angular 17中inner @for内部的递进模板

如何以条件为值管理ngIf内部的未定义值?

Angular 形式验证:在空和不匹配的密码上显示错误

Angular中绑定嵌入标签src属性的问题

布局之间的Angular 变化检测需要重新加载

在状态更新后是否会再次触发ngrx效果?

Swiper 11角17 SSR Swiper断点不工作

使用`UrlHandlingStrategy`更改位置

路由链接不在 Ionic 中执行

升级到 Webpack 5.79.0 后 NX Angular 项目构建失败

TypeError:this.restoreDialogRef.afterClosed 不是函数

使用 RxJS forkJoin 时传递参数的最佳方式

Angular 2 二传手与 ngOnChanges

如何 use/import http模块?

如何在 ANGULAR 2 中提交表单时重置表单验证

*ngIf 带有多个异步管道变量

Mat-autocomplete - 如何访问选定的选项?

Angular 2 filter/search 列表

Angular2中是否有像window.onbeforeunload这样的生命周期钩子?

如何防止角material垫菜单关闭?