angular - 如何聚焦具有 ngif 的 TextArea
问题描述
我有以下 Angular 2 组件,我需要在它变得可见时立即聚焦textarea
with id ( )bannernote
isEditEnabled
<div class="cont-notesbanner">
<p class="triangle"></p>
<h3 class="tit-notesbanner">Add notes:</h3>
<form (ngSubmit)="onSubmit(f)" #f="ngForm">
<p
class="p-notesbanner"
*ngIf="!isEditEnabled"
[ngClass]="currentAsset.notes.length === 0 ? 'it-place' : ''"
>
{{ currentAsset.notes.length === 0 ? "Add notes" : currentAsset.notes }}
</p>
<textarea
rows="4"
cols="50"
*ngIf="isEditEnabled"
class="txt-notesbanner"
name="bannernote"
id="bannernote"
rows="10"
[(ngModel)]="currentAsset.notes"
#bannernote
onload="$('#bannernote').focus();"
></textarea>
<div class="txt-right">
<a class="smallButton" (click)="onCloseBannernotes()">Cancel</a>
<a
class="smallButton"
(click)="onEditBannernotes()"
*ngIf="!isEditEnabled"
>Edit</a
>
<button type="submit" class="smallButton" *ngIf="isEditEnabled">
Accept
</button>
</div>
</form>
</div>
我已经尝试使用“onshow”和“onload”事件来实现这一点,正如您在上面看到的那样,但没有成功
我还在此方法中添加了代码,每当按钮从“编辑”切换到“接受”时都会调用该代码document.getElementById("bannernotes").focus
,但这不起作用,因为当被调用时,由于 ngif 尚未渲染该元素“执行”
onEditBannernotes() {
this.isEditEnabled = !this.isEditEnabled;
}
解决方案
您可以使用 访问代码中的元素@ViewChild
。由于元素最初可能不可用,因此将关联的属性定义为 setter,并在其中设置焦点。正如@Stefan在评论中所建议的那样,首先检查元素引用是否已定义;undefined
当元素从视图中移除时,它就变成了。
// Set the focus on the textarea as soon as it is available
@ViewChild("bannernote") set bannerNoteRef(ref: ElementRef) {
if (!!ref) {
ref.nativeElement.focus() ;
}
}
请参阅此 stackblitz以获取演示。
推荐阅读
- go - 当订阅失败时,go 客户端返回 nil
- python - 过滤人员姓名并在前端显示人员列表
- java - 如何检查android设备是否支持camera2或cameraX视频稳定的OIS或EIS
- r - 如何保存文件以便能够使用“data()”加载它,例如 data(iris)?
- c# - 当在键入时打印行时,输入的文本被拉入
- javascript - 如何使用 ngx-print 从子组件打印画布?
- python - 当我在主机操作系统中自由使用鼠标时,虚拟机(hyper-v)可以使用 pyautogui 以编程方式控制其鼠标吗?
- python - if 语句语法。错误的输出
- clips - CLIPS 6.3 IDE 编辑器面临类型问题?
- javascript - CKEDITOR5 添加自定义类以列出元素并保留它们