2 回答
TA贡献1785条经验 获得超4个赞
经过大量的挖掘,终于找到了我正在寻找的解决方案。它是如此直接,希望这可以帮助其他可能需要做同样事情的人..
从查询参数中获取 css 路径,然后将文档注入 TS 文件...将链接附加到文档的头部。
我使用 canActivate 在 Router Guard 中做到了这一点。我从 routerstatesnpshot 得到了查询参数,如下所示:
在构造函数中注入 DOCUMENT(不要忘记导入)
http://server.com/xxx&broker=1&client=2&css=http://cssServer.com/my_dynamic_stylesheet.css
import { DOCUMENT } from '@angular/common';
@Inject(DOCUMENT) private document: Document
this.setDynamicStyle(state.root.queryParamMap.get('css'));
setDynamicStyle(cssURL: string) {
const head = this.document.getElementsByTagName('head')[0];
const style = this.document.createElement('link');
style.id = 'css-styling';
style.rel = 'stylesheet';
style.href = `${cssURL}`;
head.appendChild(style);
}
感谢:https : //juristr.com/blog/2019/08/dynamically-load-css-angular-cli/
TA贡献1789条经验 获得超8个赞
这似乎是一个相当普遍的问题,动态更新样式,我找不到任何人们试图覆盖 Anuglar 2 应用程序的整个 CSS 文件的地方,编译后。
我最终做了什么(现在)......
在 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;
自我注意,在 app-root 级别执行此操作可能意味着不必为每个组件 css 文件应用样式...,但我们仍然需要将指令应用于我们想要动态设置样式的每个元素。ViewEncapsulation 将需要在较低的组件中为 NONE。
然后,在每 10 秒(现在)一次 httpClient 调用中,例如:
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 更新动态更新的痛苦是忙碌的。
我不会称其为最初问题的解决方案,而是一种痛苦的解决方法。
添加回答
举报