【问题标题】:How to dynamicly add style to objects in *ngFor如何为 *ngFor 中的对象动态添加样式
【发布时间】:2018-06-04 08:16:52
【问题描述】:

我有一个成员列表,每个成员都有一个角色,我想根据角色为其名称着色。在我的 HTML 中,我使用 *ngFor 运行以创建每个 div,但我没有设法为 div 着色。

【问题讨论】:

  • 将您的代码添加到问题中。
  • 这可以在官方关闭原因下关闭:请说明您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅“如何提问”页面以获得澄清此问题的帮助。

标签: angular styles


【解决方案1】:
  1. 最简单的方法是使用成员的角色作为你的 css 类。你的 html 就是这样:

    <div *ngFor="let member of members" class="{{member.role}}">
      {{member.name}}
    </div>
    

例如,如果您有这样的成员列表:

members = [
 {name: 'jan', role: 'admin'},
 {name: 'kees', role: 'user'},
 {name: 'piet', role: 'admin'},
 {name: 'joop', role: 'user'},
 {name: 'klaas', role: 'superman'},
];

你的 CSS 应该是这样的:

.admin {
    background-color: yellow;
}

.user {
    background-color: red;
}

.superman {
    background-color: blue;
}
  1. 另一种方法是使用函数来确定 ts 文件中每个角色的颜色:

    getColorClass(role: string) {
      let returnValue;
      switch (role) {
      case 'admin':
        returnValue = 'red';
        break;
      case 'user':
        returnValue = 'yellow';
        break;
      case 'superman':
        returnValue = 'blue';
        break;
      default:
        returnValue = 'white';
    }
    return returnValue;
    

    }

并像这样在你的 html 中使用这个函数:

<div *ngFor="let member of members" [style.background-color]="getColorClass(member.role)">
  {{member.name}}
</div>
  1. 第三种方法是将 ngClass 与选项 2 中的函数结合使用。该函数的返回值将是您的类的名称。你的 html 看起来像这样:

    <div *ngFor="let member of members [ngClass]="getColorClass(member.role)">
    {{member.name}}
    </div>
    

    如果您在 ts 文件中使用与选项 2 中完全相同的功能,那么您的 css:

    .yellow {
      background-color: yellow;
    }
    
    .red {
      background-color: red;
    }
    
    .blue {
      background-color: blue;
    }
    

当然,这些类名可以更改为您想要的任何名称。 希望这会有所帮助。

【讨论】:

  • 大家好,非常感谢您的回答。这些建议的问题是,用户正在添加角色,因此无法从 css 文件中检索颜色。其次,重新调整函数以获取我尝试过的颜色,但似乎该函数不断被调用,我不确定它是否是好的解决方案。您可以假设成员对象上有颜色。我想过使用模板变量的解决方案,但我没有设法将其拉出来。
  • {{member?.member?.firstName}} {{member?.member?.lastName}} {{member?.role?.roleName}}
  • 对于您显示的每个成员,该函数都会被调用,但它应该是这样工作的。如果我理解正确,您没有预先拥有角色,因为用户提供了角色?我认为最简单的方法是收集用户在数组中输入的所有独特角色。然后调整函数,例如,而不是 case 'admin',它会说 case yourArray[0] etc..
  • 艾美,你的假设是对的。我不知道如何在 html 中实现它,我可以将它嵌入到 style="" 中还是我需要 angular 指令?我尝试使用函数方法并将每次调用打印到控制台,我看到函数被不断调用。这就是为什么我想知道它是否合法
  • 显然,由于更改检测,带有函数的样式会被多次调用。关于使用它是否是好的做法的意见似乎不同。如果你愿意,你可以多看一点。另见:stackoverflow.com/questions/41471232/…
【解决方案2】:

所以我想了一个答案,而不必使用函数来获取 HTML 中的样式,同时仍然没有预定义的角色。

您可以为您的成员添加一个颜色属性,这将基于成员的角色。假设您在制作组件之前知道成员和颜色,您可以在ngOnInit() 中设置它,如下所示:

ngOnInit() {
    this.assignColorsToMembers();
  }

  assignColorsToMembers() {
    const uniqueRoles = this.getUniqueRoles();
    const rolesWithColors = this.assignColorsToRoles(uniqueRoles);
    this.members.forEach(member => {
      member.color = rolesWithColors[member.role];
    });
  }

  getUniqueRoles(): string[] {
    const allRoles = this.members.map(member => member.role);
    const uniqueRoles = Array.from(new Set(allRoles));
    return uniqueRoles;
  }

  assignColorsToRoles(roles: string[]): RolesWithColors {
    const rolesWithColors = {};
    roles.forEach((role, index) => {
      rolesWithColors[role] = this.colors[index];
    });
    return rolesWithColors;
  }

接口:

interface RolesWithColors {
  [key: string]: string;
}

interface Member {
  name: string;
  role: string;
  color?: string;
}

在 getUniqueRoles() 中,您创建一个数组,获取所有成员的角色,然后删除重复项。在 assignColorsToRoles() 中,您创建一个对象,其中键(属性)是您在 getUniqueRoles() 中创建的数组中的角色,值是您的颜色数组中的颜色。

这假设您有一个颜色与此类似的数组:colors = ['red', 'yellow', 'blue', 'green', 'purple'];,并且您的颜色数组的长度足以为每个角色赋予不同的颜色。

如果你的颜色数组不够长,你可以在函数中检查:

assignColorsToRoles(roles: string[]): RolesWithColors {
  const rolesWithColors = {};
  roles.forEach((role, index) => {
    if (this.colors.length < index + 1) {
      rolesWithColors[role] = 'white';
    }
    rolesWithColors[role] = this.colors[index];
  });
  return rolesWithColors;
}

当然,您可以用白色代替您想要的任何其他颜色。

如果您已经将颜色与某些角色相结合,这将简单得多。您可以省略 assignColorsToMembers 的前两个步骤,并根据您的角色和颜色的保存方式(数组或对象)更改其余步骤。

现在所有成员都有一个颜色分配给他们,你可以在你的 html 中使用这个属性:

<div *ngFor="let member of members" [style.background-color]="member.color">
  {{member.name}}
</div>

【讨论】:

    【解决方案3】:

    试试这个:

    <div *ngFor="let member of members">
     <div [ngClass]="{'red': member.role === 'name of the role', 'blue': member.role === 'name of the role'}">
      {{member.name}}
     </div>
    </div>
    

    【讨论】:

    • 颜色和角色由用户创建。因此,无法从 css 或代码中的任何常量变量中检索这些值。颜色应该从 db/members 对象中获取。
    • 那么你只需要更新[ngClass]中的条件。您能否将您的颜色和用户角色示例添加到问题中
    • 嗨,Anuradha,我没有设法为模板变量分配颜色(在 *ngFor 的每个循环中更新),并将其推送到 ngClass 中,你能举个简单的例子吗?跨度>
    • 请添加您的用户角色模型示例。至少您用于生成列表的数组。
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2023-03-30
    • 2019-06-23
    • 2016-07-31
    相关资源
    最近更新 更多