当我将元素设置为 Angular 6 中可编辑的内容时,如何设置元素的焦点?

Posted

技术标签:

【中文标题】当我将元素设置为 Angular 6 中可编辑的内容时,如何设置元素的焦点?【英文标题】:How I can set focus on the element when I am setting it to content editable in Angular 6? 【发布时间】:2020-03-17 09:10:50 【问题描述】:

我正在使用 Angular 6 的 contentEditable 属性来编辑元素的内容(在 ngFor 中)

当标签元素的 contentEditable 属性为真时,如何设置焦点?

<div class="tag" *ngFor="let tag of tags">
   <span [contentEditable]="underUpdateTagId==tag.id" [textContent]="tag.title 
    (input)="tag.title=$event.target.textContent">
   </span>
   <span *ngIf="underUpdateTagId!=tag.id" class="edit text-info" (click)="beforeEdit(tag)">
         <i class="fas fa-pencil-alt"></i>
   </span>
   <span *ngIf="underUpdateTagId==tag.id" class="update text-success" (click)="editTag(tag)">
         <i class="fas fa-check save"></i>
   </span>
   <span class="delete text-danger" (click)="delete(tag)">
         <i class="fas fa-trash-alt"></i>
   </span>
</div>

用户界面:

【问题讨论】:

【参考方案1】:

我们可以使用ViewChildren 来获取所有跨度,通过放置一个模板引用,拾取选中的span 并将焦点设置到元素。

所以我建议添加模板引用并在您的beforeEdit() 中传递标签的索引(我们从 ngFor 获取),以便我们在想要将焦点放在字段上时引用它:

<!-- add template reference in below span tag --->
<span [contentEditable]="underUpdateTagId==tag.id" ... #spans>
<!-- pass index as from ngFor iteration to beforeEdit() -->
<span *ngIf="underUpdateTagId!=tag.id" class="edit text-info" (click)="beforeEdit(tag, i)">
<!-- more code --->

在组件中我们引用spans,模板引用。并且当点击时指定传递索引的跨度应该被聚焦:

@ViewChildren("spans") spans: QueryList<ElementRef>;
underUpdateTagId = null;

beforeEdit(tag, index) 
  this.underUpdateTagId = tag.id;
  // wait a tick
  setTimeout(() => 
    this.spans.toArray()[index].nativeElement.focus();
  );

STACKBLITZ

PS,这将焦点放在开头,你可能想要它在结尾,如果是这样的话,也许这个问题可以帮助你:Use javascript to place cursor at end of text in text input element

【讨论】:

以上是关于当我将元素设置为 Angular 6 中可编辑的内容时,如何设置元素的焦点?的主要内容,如果未能解决你的问题,请参考以下文章

编辑 Angular 材质表单元格填充

如何在 Angular 组件的输入元素上正确设置 ID?

当我将它们的元素设置为彼此堆叠(块)时,为啥我的 flex-box 元素会“浮动”彼此相邻?

在带有 Angular 6 的 ag-Grid 18.0 中的 cellValueChanged 事件之后设置对已编辑列的排序

Angular 组件宿主元素的宽度和高度为 0

当我将电子邮件放入有效负载时,Angular 代理出错