这是循环显示按钮的代码。
for( let k=0; k<this.newTmpArr.length; k++ ){
myTable += "<tr>";
for( let key2 in this.newTmpArr[k] ){
if(this.newTmpArr[k][key2] == 'button' ){
myTable += `<td><button (click)="test()">Click</button></td>`;
break;
}
if(this.newTmpArr[k][key2] == 'link' ){
myTable += `<td><a href="#" (click)="test()">Click</a></td>`;
break;
} else {
myTable += "<td>" + this.newTmpArr[k][key2] + "</td>";
}
}
myTable += "</tr>";
}
test(){
alert("Working!");
}
这是呈现动态数据后的页面截图。
最佳答案
阅读详情:Dynamic Html Structure with - *ngIf, *ngFor & ngSwitch
你可以试试看,下面的模板方式没有太大变化就可以正常工作,下面只用了20分钟
App.Component.html --- 模板文件
<table>
<thead>
<tr>
<th>ID</th>
<th>Date</th>
<th>Ammount</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let ele of newTmpArr" >
<td>{{ele[0]}}</td>
<td>{{ele[1]}}</td>
<td>{{ele[2]}}</td>
<td>
<div ngSwitch="{{ele[3]}}">
<div *ngSwitchCase="'button'">
<input type="button" (click)="DoWork(1)" value="click"/>
</div>
<div *ngSwitchCase="'link'">
<a href="#" (click)="DoWork(1)" >click</a>
</div>
</div>
</td>
</tr>
</tbody>
</table>
App.Component.ts-- typescript
export class AppComponent implements OnInit {
ngOnInit(): void {}
title = 'app';
DoWork()
{
//here you can do work ,
//this get called when you press "click" button in table
alert(this.title);
}
}
无模板动态方式
我花了 5 个小时才找到这段代码,但 Following 工作正常,您需要在 DomSanitizer
的帮助下绕过安全性,因为您想要从模板文件中放入输入元素。
//typings.d.ts
interface Window { my: any; }
上面一个扩展了你的窗口对象
app.Component.html
<table>
<thead>
<tr>
<th>ID</th>
<th>Date</th>
<th>Ammount</th>
<th>Action</th>
</tr>
</thead>
<tbody id="tid" [innerHTML]="bodytext"></tbody>
</table>
typescript 文件 - app.Component.ts
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
import {Component, NgZone, OnInit, OnDestroy} from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
title = 'app';
_myTable : string;
bodytext ;
newTmpArr = [
["567", "2017-04-17T14:22:48", "45000", "button"],
["567", "2017-04-17T14:22:48", "45000", "button"],
["567", "2017-04-17T14:22:48", "45000", "link"],
["567", "2017-04-17T14:22:48", "45000", "button"]
];
constructor(private http: Http,private _sanitizer:
DomSanitizer,private ngZone: NgZone) {
}
ngOnInit(): void {
//below code add dynamci table to your html
for( let k=0; k<this.newTmpArr.length; k++ ){
this._myTable += "<tr>";
for( let key2 in this.newTmpArr[k] ){
if(this.newTmpArr[k][key2] == 'button' ){
//below is table click button calls angular function,
//here 1 is passed as arugment you can pass
//any other value you want
//or if you dont want to pass than just do
// onclick="my.namespace.publicFunc();"
// and remove parameter from typscript function also
this._myTable += `<td><input type="button"
onclick="my.namespace.publicFunc(1);"
value="Click me" /></td>`;
break;
}
if(this.newTmpArr[k][key2] == 'link' ){
this._myTable += `<td><a href="#"
onclick="my.namespace.publicFunc(1);
return false;">Click</a>
</td>`;
break;
} else {
this._myTable += "<td>" +
this.newTmpArr[k][key2] + "</td>";
}
}
this._myTable += "</tr>";
}
this.bodytext =
this._sanitizer.bypassSecurityTrustHtml(this._myTable);
//code to add dynamic html ends here
//below script helps to expose anglar function to javascript
window.my = window.my || {};
window.my.namespace = window.my.namespace || {};
//below line bind typescript function to window object publicFunc
window.my.namespace.publicFunc =
this.OnTableButtonClick.bind(this);
//code to expose typscipt function ends here
}
//this function get called when Table click button ge clicked
public OnTableButtonClick(input:string):void{
this.ngZone.run(() => this.DoWork(input));
}
DoWork(input:string)
{
//here you can do work ,
//this get called when you press "click" button in table
alert(this.title + input);
//this will display app1 in output
}
}
关于Angular 4 在按钮上动态添加点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47669161/