Похоже, это довольно распространенная проблема, динамическое обновление стилей, и я не могу найти ничего там, где люди пытались переопределить весь файл CSS для приложения Anuglar 2, после компиляции.
То, что я в итоге делал (пока) ...
На ссылке GitHub: https://github.com/angular/angular/issues/9343 Благодаря: peteboere
Создал директиву типа
import {Directive, ElementRef, Input} from '@angular/core';
@Directive({
selector: '[cssProps]',
})
export class CSSPropsDirective {
@Input() cssProps: any;
constructor(private element: ElementRef) {}
ngOnChanges({cssProps})
{
if (cssProps && cssProps.currentValue)
{
const {style} = this.element.nativeElement;
for (const [k, v] of Object.entries(cssProps.currentValue))
{
style.setProperty(k, v);
}
}
}
}
К сожалению, это означает размещение cssProps в КАЖДОМ и КАЖДОМ элементе в моих документах, для которых требуется стилизация, например:
<div class="panel-heading" [cssProps]="cssStyling">
Затем я создал простой Сервис для извлечения стилей в формате JSON, например,
{--backgroundColor: "black"}
в файле css для каждого компонента. Для их обработки я использовал пользовательские свойства css.
background: var(--backgroundColor)
--backgroundColor: #008000;
ПРИМЕЧАНИЕ. SELF, делая это на уровне приложения, может означать, что не нужно применять стилидля каждого компонента css file ..., но нам все равно нужно будет применить директиву к каждому элементу, который мы хотим динамически стилизовать. ViewEncapsulation должен быть NONE для нижних компонентов.
Затем при вызове httpClient каждые 10 секунд (на данный момент), например:
import { HttpClient } from '@angular/common/http';
import { Subject, Subscription } from 'rxjs';
import { Injectable } from '@angular/core';
@Injectable({providedIn: 'root'})
export class StyleSerivce {
styleChanged = new Subject<any>();
interval = new Subscription();
styles:any;
constructor(private httpClient: HttpClient) { }
retrieveStyleFrom() {
setInterval(() => {
this.httpClient.get('https://serverName/stylesss.json')
.subscribe(data => {
console.log(data);
this.styles = data;
this.styleChanged.next(this.styles);
})
}, 10000);
}
}
Я подписался на styleChange в соответствующих компонентах, например:
this.styleSub = this.styleService.styleChanged.subscribe((styleNow) => {
this.cssStyling = styleNow;
})
и с привязкой cssStyling к моей директиве, когда я обновляю БД, в которой хранится JSON, я могу динамически обновлять экран ... (по истечении 10 секунд)
Это работает, но проблема установки этого тега для каждого тега, чтобы сделать его динамически обновляемым из обновлений DB / JSON, является беспокойной.
Я бы не назвал это решением начальной проблемы, но болезненным обходным путем.