angular - 从 dom 生成的元素调用组件函数 - 角度
问题描述
我想创建一个动态数量的 html dom 元素按钮,并让它们能够在单击时调用服务。有没有办法做到这一点?
例如 test.component.ts:
import {ApiService } from '../services/api.service';
...
export class test implement OnInit(){
constructor(private apiGet : ApiService) { }
ngOnInit() {
...
for (i = 0; i < x; i++) {
var row = document.getElementById('row');
var cell = insertCell();
cell.innerHTML = "<button name='" + i + '" (click)=test.callService()>click me</button>";
}
}
public callService() {
//call ApiService here using buttons name
}
}
当我将 (click) 事件放在 test.component.html 中的 html 元素上时,我一直在让它工作,但它对 dom 生成的按钮不起作用。有什么我想念的,还是有更好的方法来做到这一点?
解决方案
对于动态创建的元素,必须使用addEventListener()
方法定义事件处理程序。您也可以手动触发更改检测以确保元素是在 DOM 中生成的。尝试以下
import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
import { ApiService } from '../services/api.service';
...
export class test implement OnInit {
constructor(private apiGet: ApiService, private _cdr: ChangeDetectorRef) { }
ngOnInit() {
...
for (i = 0; i < x; i++) {
var row = document.getElementById('row');
var cell = insertCell();
cell.innerHTML = "<button id='button" + i + "' name='" + i + '">click me</button>";
}
this.addEventListeners(x);
}
private addEventListeners(x) {
this._cdr.detectChanges(); // <-- manually trigger change detection to be sure
for (i = 0; i < x; i++) {
const button = document.getElementById('button' + i);
if (button) {
button.addEventListener('click', this.callService());
}
}
}
public callService() {
//call ApiService here using buttons name
}
}
也不相关,export class test implement OnInit(){
应该换成export class test implement OnInit {
. 这里不需要括号。
推荐阅读
- python - scipy.optimize 差分进化中初始参数的形状
- revit-api - 收集用户选择元素
- javascript - Angular中的日期序数(st,nd,rd,th)?
- hadoop - 需要在集群中的所有 hadoop 节点中安装 MIT KDC 以进行 Kerberos 身份验证?
- anaconda - Dask 安装在 Windows 中失败并出现错误:[WinError 2] 系统找不到指定的文件
- ansible - 如何在 ansible-awx 中使用 node 命令运行任务?
- swift - AVAssetExportSession 进度未更新
- sequelize.js - Sequelize 不创建模型关联列
- ms-access - 将记录添加到数据库并同时上传图像(第二次尝试使用不同的代码)
- c++ - 有没有办法在集合中引用类的方法?