Угловая 5 - связать полное выражение стиля

Я хочу связать полное выражение стиля для элемента HTML.

например: выражение, как это в home.ts:

divStyle:string = "top:50%;bottom:50%;color:green;";

и в home.html я попробовал эти способы привязать стиль к элементу:

<div class="preloader" [attr.style]="divStyle">

или же

<div class="preloader" [style]="divStyle">

или же

<div class="preloader" [ngStyle]="divStyle">

Но это не сработало.

кто-нибудь знает, возможно ли это сделать?

2 ответа

Решение

Из-за ограничений безопасности; сначала вам нужно очистить строку стиля с помощью средства DOM:

Составная часть:

import { Component } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  divStyle: string = 'background-color: red; font-weight: 600;';

  constructor(private sanitizer: DomSanitizer){}

  sanitize(style: string) {
    return this.sanitizer.bypassSecurityTrustStyle(style);
  }
}

Шаблон:

<div [style]="sanitize(divStyle)">
  Content
</div>

Рабочий образец: https://stackblitz.com/edit/angular-pkjd2q


В идеале вы должны использовать другой подход, такой как директива NgStyle, которая ожидает объект стиля, а не строку. Вам нужно будет сделать следующее:

Составная часть:

divStyle: string = { top: "50%", bottom: 50%, color: "green" };

Шаблон:

<div [ngStyle]="divStyle"></div>

Может быть, попробовать что-то с этой формой:

<div class="preloader" 
    [ngStyle]="{'top': '50%',
                'bottom': '50%',
                'color': 'green'}">

Как упоминал @Gorka Hernandez, это могло бы быть более элегантно с трубками, например:

shared.pipe.ts

@Pipe({
  name: 'safe'
})
export class SafePipe implements PipeTransform {

  constructor(protected sanitizer: DomSanitizer) {}

  public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
    switch (type) {
            case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);
            case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);
            case 'script': return this.sanitizer.bypassSecurityTrustScript(value);
            case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);
            case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);
            default: throw new Error(`Invalid safe type specified: ${type}`);
        }
  }

}

custom.pipe.ts

@Pipe({
  name: 'severityColor'
})
export class SeverityColorPipe extends SafePipe implements PipeTransform {

  constructor(protected sanitizer: DomSanitizer){
    super(sanitizer)
  }

  transform(severity: number): SafeStyle {
    switch (severity) {
      case 9:
      case 10:
        return super.transform('background-color: rgba(255, 165, 0, .2)', 'style');
    
      default:
        break;
    }
  }

}

Применение:

custom.html

<div *ngFor="let severity of severities">
    <div [style]="severity | severityColor"></div>
</div>
Другие вопросы по тегам