基于数组值的ngStyle表

时间:2019-01-17 11:13:43

标签: html angular angular6

我想获得一个这样的表:

enter image description here

我有2个物体

  users = [
    { name: 'john', age: '22' },
    { name: 'mike', age: '20' },
    { name: 'dan', age: '12' },
    { name: 'anne', age: '16' },
    { name: 'jenny', age: '42' },
  ]

  names = [
    { name: 'john', color: 'black' },
    { name: 'mike', color: 'black' },
    { name: 'dan', color: 'red' },
    { name: 'anne', color: 'red' },
    { name: 'jenny', color: 'red' },
  ]

如果names中的一个名字在users中,我希望它的颜色在表中为black,否则,我希望它为red

这是我的html:

<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Age</th>
        </tr>
    </thead>
    <tbody>
        <tr *ngFor="let user of users">
            <ng-container *ngFor="let x of names">
                <ng-container *ngIf="x.name == user.name">
                    <td [ngStyle]="{ 'color': names.color }">{{ user.name }}</td>
                    <td [ngStyle]="{ 'color': names.color }">{{ user.age }}</td>
                </ng-container>
            </ng-container>
        </tr>
    </tbody>
</table>

但是它不能正常工作。 You can see a working snippet here

如何实现我想要的?谢谢您的时间!

2 个答案:

答案 0 :(得分:1)

引用color时出现错字。 color是对象的属性,而不是您要遍历的数组:

<td [ngStyle]="{ 'color': names.color }">{{ user.name }}</td>
<td [ngStyle]="{ 'color': names.color }">{{ user.age }}</td>

应该是

<td [ngStyle]="{ 'color': x.color }">{{ user.name }}</td>
<td [ngStyle]="{ 'color': x.color }">{{ user.age }}</td>

答案 1 :(得分:1)

您可以创建一种根据名称(放置在组件中)检索颜色的方法

getColor(name) {
  return this.names.find(e => e.name === name).color;
} 

并致电

<td [style.color]="getColor(user.name)">{{ user.name }}</td>
<td [style.color]="getColor(user.name)">{{ user.age }}</td>

像这样使用双循环时,您不需要双循环,但它仍需要为每次迭代执行一个查找循环。

更好的方法是先合并两个数组,然后使用它

combined = [];


constructor() {
  this.combined = this.users.map(e => Object.assign(e, this.names.find(x => x.name === e.name)))
}

用法

    <tr *ngFor="let user of combined">        
        <td [style.color]="user.color">{{ user.name }}</td>
        <td [style.color]="user.color">{{ user.age }}</td>
    </tr>