我是Angular2框架的新手。我尝试在整个应用程序中重用单个表组件。什么时候,我试图这样做,我面临困难重复我的表行中的任何类型的数组。如何使我的表行迭代任何类型的数组,该数组作为输入传递给我的表组件。
当我将数组作为输入传递给它时,是否可以重用我的表组件?
以下是我的代码段。我该如何重复使用它?请建议我最好的方法。
app.component.html
<table>
<thead>
<td>name</td>
<td>empid</td>
</thead>
<tbody>
<tr *ngFor="let item of items;">
<td>{{item.name}}</td>
<td>{{item.empid}}</td>
</tr>
</tbody>
</table>
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app works!';
items=[{name:"ravi",empid:"10215"},{name:"ravi",empid:"10215"},{name:"ravi",empid:"10215"},{name:"ravi",empid:"10215"},{name:"ravi",empid:"10215"}];
}
答案 0 :(得分:2)
对于具有不同结构的类型的数组,可以只创建一个管道并提取值(尽管这确实增加了大约一半的内存占用量)
@Pipe({
name: 'objectValues'
})
export class ObjectValuesPipe implements PipeTransform {
transform(obj: any) {
let result = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
result.push(obj[key]);
}
}
return result;
}
}
这里我们只是从对象中提取值,并将它们返回到数组中。
然后在你的表中,做一下
@Component({
selector: 'my-table',
template: `
<table>
<thead>
<td *ngFor="let header of headers">{{ header }}</td>
</thead>
<tbody>
<tr *ngFor="let item of items">
<td *ngFor="let value of item | objectValues">
{{ value }}
</td>
</tr>
</tbody>
</table>
`
})
export class TableComponent {
@Input() items
@Input() headers
}
另见
ngFor
中迭代地图和对象的讨论。它目前不受支持,因此其他人提出了解决方案。答案 1 :(得分:1)
是的,你可以将你的表作为可重用的表组件:
<强> table.component.ts 强>
import {Component, Input} from '@angular/core';
@Component({
selector: 'app-table',
templateUrl: './table.component.html',
styleUrls: ['./table.component.css']
})
export class TableComponent {
@Input() items;
@Input() field1;
@Input() field2;
constructor() {
}
}
<强> table.component.html 强>
<table>
<thead>
<td>name</td>
<td>empid</td>
</thead>
<tbody>
<tr *ngFor="let item of items;">
<td>{{item[field1]}}</td>
<td>{{item[field2]}}</td>
</tr>
</tbody>
</table>
<强> app.component.html 强>
<app-table [items]="data" [field1]="field1" [field2]="field2"></app-table>
<强> app.component.ts 强>
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent{
// data: any[] = [{name: "ravi", empid: "10215"}, {name: "ravi", empid: "10215"}];
// field1: string = 'name';
// field2: string = 'empid';
field1: string = 'product';
field2: string = 'price';
data = [
{product: "mobile", price: "10215"},
{product: "camera", price: "10215"}
];
constructor() { }
ngOnInit() {
}
}
答案 2 :(得分:1)
this.keys = Object.keys(this.data);
<tr *ngFor="let row of data">
<td *ngFor="let key of keys">
{{ row[key] }}
</td>
</tr>