首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在angular中动态更改颜色和状态

在angular中动态更改颜色和状态
EN

Stack Overflow用户
提问于 2019-12-30 22:47:58
回答 3查看 8.7K关注 0票数 1

我正在开发一个angular应用程序。我有一个来自rabbitmq的JSON响应。此响应有一个参数level,它的值可以是low、medium或high。如果在运行时level的值很低,那么我想用小矩形中的颜色来表示它,并将level写在它旁边。

对于每个级别,颜色应随级别名称动态变化。我该怎么做呢?

我的响应如下所示

代码语言:javascript
复制
{
    "Source": "",
    "Type": "",
    "Timestamp": "2019-07-11T06:00:00.000Z",
    "Content": {
     level: medium
    }
}

我的回复如下:

代码语言:javascript
复制
this.subscription = this.service.subscribe(resp => {
   this.level = resp.Content.level
}
EN

回答 3

Stack Overflow用户

发布于 2019-12-30 23:11:05

你需要创建每个级别值的类库,比如low,meduim,high。

app.component.css

代码语言:javascript
复制
.medium , .low , .high{
  margin: 1rem;
  border:1px solid currentColor;
  padding: 0.5rem;
}

.medium{
 color: green
}

.low {
color: yellowgreen
}

.high {
  color: red
}

app.component.html

代码语言:javascript
复制
<div *ngFor=" let item of items" [ngClass]="item.Content.level">
    {{item.Content.level}}
</div>

demo

票数 1
EN

Stack Overflow用户

发布于 2019-12-31 01:24:38

让我们从设置您提供的示例开始,但添加一个枚举,我们将使用它来保持模板的整洁。

some.component.ts

代码语言:javascript
复制
import { Component, OnInit } from '@angular/core';
import { of, Subscription } from 'rxjs'

// Example level enum
export enum RabbitMqResponseLevel {
  Low = 'low',
  Medium = 'medium',
  High = 'high'
}

@Component({
  selector: 'my-app',
  templateUrl: './some.component.html',
  styleUrls: [ './some.component.css' ]
})
export class SomeComponent implements OnInit {

  level: RabbitMqResponseLevel;
  subscription: Subscription;

  constructor() {}

  ngOnInit() {
    this.subscription = this.simulateRabbitMq.subscribe(
      (resp) => {
        this.level = resp.Content.level as RabbitMqResponseLevel; // cast the string to our enum.
      }
    )
  }

  /**
   * returns an observable that we can subscribe to for this demos purpose.
   */
  private get simulateRabbitMq() {
    return of({
      "Source": "",
      "Type": "",
      "Timestamp": "2019-07-11T06:00:00.000Z",
      "Content": {
      level: 'medium' // assuming medium is a string.
      }
    });
  }

}

现在我们可以在组件样式文件中编写一些与您的级别字符串匹配的样式。

some.component.css

代码语言:javascript
复制
.low { color: green; }
.medium { color: orange; }
.high { color: red; }

最后,您的模板文件可以保持整洁,如下所示

some.component.html

代码语言:javascript
复制
Status: <span [ngClass]="level">{{level}}</span>

这将在视觉上给你

下面是一个stackblitz示例(我在伪响应之间添加了一个延迟,这样您就可以看到随着值的传入,状态会如何变化)

https://stackblitz.com/edit/angular-changing-color-and-status-dynamically

编辑:为实现此目的的其他方式添加替代解决方案。

您还可以将状态颜色分离到它自己的组件中,并更直接地使用枚举中设置的类。这将删除我提供的示例中"app component“中的所有垃圾。

在本例中,我创建了一个新组件,它接受级别输入并将其设置为类。剩下的工作就是编写css,以任何您想要的方式响应类。

在本例中,我更改了字体颜色以匹配级别,并创建了一个状态块来匹配级别颜色。

代码语言:javascript
复制
import { Component, Input, HostBinding } from '@angular/core';
import { RabbitMqResponseLevel } from './rabbitmq-response-level.enum';

@Component({
  selector: 'level-status',
  template: `<span class="status-block"></span><ng-content></ng-content>`,
  styles: [`

    /* shape of the status block */
    :host > .status-block { 
      display: inline-block;
      width: 0.5em;
      height: 0.5em;
      margin-right: 0.5em;
      background-color: black; /* default color */
    }

    /* status block colors */
    :host.low    .status-block { background-color: green; }
    :host.medium .status-block { background-color: orange; }
    :host.high   .status-block { background-color: red; }

    /* font colors */
    :host.low     { color: green; }
    :host.medium  { color: orange; }
    :host.high    { color: red; }

  `]
})
export class LevelStatusComponent  {

  /**
   * This is the input that sets the class based on the enum string.
   * It uses HostBinding to class to auto attach the string value
   * to the elements class attribute.
   */
  @Input()
  @HostBinding('class') 
  level: RabbitMqResponseLevel;

}

app.component.html

代码语言:javascript
复制
Status: <level-status [level]="level">{{level}}</level-status>

这是一个工作的实时示例https://stackblitz.com/edit/angular-changing-color-and-status-dynamically-2

票数 1
EN

Stack Overflow用户

发布于 2019-12-30 23:03:16

您可以使用ngClass https://angular.io/api/common/NgClass

示例:

代码语言:javascript
复制
<your-level-element [ngClass]="{'low': parameter.level === 'low', 'medium': parameter.level === 'medium'}">

你将有3个类(每个级别一个),你可以自定义背景(或任何样式)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59532652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档