Angular 2 - 如何根据 URL 查询参数动态更改整个 CSS 样式表

Cra*_*gSS 5 javascript css dynamic angular

我对 Angular 的世界很陌生(到目前为止我很喜欢它)。我们有一个 Angular 1 (JS) 应用程序,我们计划将其转换为最新的 Angular 2 (8.3.9) 版本。在旧应用程序中完成的一件事是使用 $scope 对象,然后根据请求 URL 中的查询参数动态设置根 index.html 中的 CSS 样式表链接。

使用 ngStyle 或 ngClass 更新文档中的单个元素很酷,但是,

我们如何在 Angular 2 中加载应用程序时更改整个样式表?

一切都封装在组件内部,angular.json 文件中指定的样式内置到“deployable.js”文件中。是否可以在运行时更改它?

此链接似乎是最接近的示例: Generate dynamic css based on variables angular ,但仍然不能完全解决根 index.html 文件中的问题。

当前的旧版本

网址到达:

http://someserver:port/app?css=http://linktoCSs/cssFile.css
Run Code Online (Sandbox Code Playgroud)

css 查询参数被拉入一个全局变量并存储在名为 css_url 的范围内,在 index.html(起始页面)中

<link rel="stylesheet" ng-href="{{css_url}}">
Run Code Online (Sandbox Code Playgroud)

并且应用程序开始使用此链接提供的任何样式表。

新的 Angular 2(版本 8.3.9)

我们想模仿我们能够在 JS 版本中实现的上述行为。从 QueryParam 中提取一个指向某个 CSS 文件的 URL,该 CSS URL 可以注入主 index.html 以一次性更改整个应用程序的样式,或者在代码中动态访问样式表以一次性更新所有内容.

简而言之,我们想要 1 个可以基于查询参数通过 CSS 文件设置样式的应用程序。

所有的想法和意见将不胜感激。

Cra*_*gSS 6

经过大量的挖掘,终于找到了我正在寻找的解决方案。它是如此直接,希望这可以帮助其他可能需要做同样事情的人..

从查询参数中获取 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);
    }
Run Code Online (Sandbox Code Playgroud)

感谢:https : //juristr.com/blog/2019/08/dynamically-load-css-angular-cli/