javascript - 如何选择在 Angular 中动态加载的 html 元素?
问题描述
我想选择一个动态创建的特定 html 元素。但是创建 html 块的“list”变量填充了 http 请求并且 dom 没有立即加载。我想通过从 url 获得并等于列表项 id 的 id 选择元素。所以即使我在 ngAfterViewInit 钩子中选择了元素,选定的元素也是未定义的。我该如何选择?
HTML
<div id="wrapper">
<ng-container *ngFor="let item of list">
<div [id]="item.id">{{item.content}}</div>
</ng-container>
</div>
TS
list = null;
selectedItemId = null;
ngOnInit() {
this.selectedItemId = this.activatedRoute.snapshot.params.id;
}
getList() {
this.http.get('http://api.example.com').subscribe(
result => this.list = result
)
}
ngAfterViewInit() {
const htmlElement= document.getElementById(this.selectedItemId);
/* Some codes that using htmlElement variable */
}
解决方案
如果您使用 引用 HTML 元素@ViewChildren
,您可以订阅QueryList.changes
事件以在元素出现在 DOM 中时收到通知。
在模板中,在 item 元素上设置模板引用变量:
<div id="wrapper">
<ng-container *ngFor="let item of list">
<div #itemElement [id]="item.id">{{item.content}}</div>
</ng-container>
</div>
在代码中,使用该变量名称来引用以下元素ViewChildren
:
@ViewChildren("itemElement") private itemElements: QueryList<ElementRef>;
ngAfterViewInit() {
this.itemElements.changes.subscribe(() => {
console.log("Item elements are now in the DOM!", this.itemElements.length);
const htmlElement = document.getElementById(this.selectedItemId);
...
});
}
请参阅此 stackblitz以获取演示。请注意,如果它只包含一个元素,ng-container
则不需要。div
您可以将该*ngFor
指令直接应用于该元素。
推荐阅读
- pandas - 如何用不同形状的数据框划分熊猫数据透视表?
- javascript - 通过类的文本样式设置不适用于 ProgressBar.js
- ios - 使 ViewController 成为单击按钮的侦听器,位于 TableViewCell xib 内的自定义视图内?
- apache-spark - Spark 结构化流中的等式过滤器
- c# - How to get counted words in files in BODY field?
- amazon-web-services - 在本地环境中将 NoSql (DynamoDB) 与 Elastisearch(不是 AWS 管理的)同步的最佳方式
- java - 将android包添加到java模块(android studio)
- html - 使用 VBA 和 HTML 的 Outlook 中 MailItem 表的特定列宽
- html - React 表单在基本 url 前面
- javascript - HTML中大多数点击的排行榜?