【问题标题】:Angular set component styleUrls dynamicallyAngular 动态设置组件 styleUrls
【发布时间】:2018-10-04 07:10:21
【问题描述】:

我在新项目中使用的是最新版本的 angualar 5.0。我是这个框架的新手,希望有角度的开发人员提供一些帮助。

我想在运行时动态设置带有类级别变量的 styleUrls 属性。在我的例子中,styleURL 路径将通过角度服务来自数据库。

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

@Component({    
    templateUrl: './search.component.html',
    styleUrls: ['./search.component.css']
})


export class SearchComponent {
    pageName = 'New Search Page';
    PropfavMovie = 'Gladiator';

    constructor(private _titleSrv: Title) {
        this._titleSrv.setTitle('Search page');

    }

有没有办法可以在 ngOnInit 事件或 SearchComponent 类的构造函数中设置组件的 styleUrls 属性

在我的例子中,每个客户端都有自己的样式表。所以我需要从数据库中提取样式表路径并动态填充@components 属性。

【问题讨论】:

  • 您可能会即时生成 css 文件本身,只是一个想法......
  • 有趣的问题 - 动态 css 文件,既然如此,为什么不在你的模板中简单地使用 ngClassngStyle 呢?
  • stavm - 在我的例子中,每个客户端都有自己的样式表。所以我需要从数据库中提取样式表路径并动态填充@components 属性。
  • 您的数据库中到底有什么?您可以动态添加全局样式表,但带有 styleUrls 的组件特定样式表是在构建时设置的。

标签: angular angular-components angular-component-life-cycle


【解决方案1】:

我不是专家,但考虑到 Angular 的工作方式,我认为您要求做的事情是不可能的。

我相信 styleUrls 指向的 CSS 或 styles 中提供的文字 CSS 会与组件 HTML 一起传递给模板编译器(在现代 Angular 中称为 Ivy)。这将创建一个“组件工厂”,用于在运行时创建组件实例。工厂可以在构建时编译(提前/AOT)或在客户端动态编译,但即使在后一种情况下,我认为它是在最初加载拥有模块时编译的——如果可以编译一个新工厂苍蝇,我还没有看到任何方法。

我的建议是为每个(类型的)客户端创建一个单独的模块,然后查找该客户端使用哪个模块并使用路由器延迟加载它。或者,也许您可​​以将各种样式表的公共部分分解为一个静态表,并使用ngClass 条件使其余样式动态化。

【讨论】:

    【解决方案2】:

    您可以使用函数来动态计算要加载的 de 样式文件:

    import { Component } from '@angular/core';
    import { Title } from '@angular/platform-browser';
    
    //An alias that stores environment vars
    import { ENV } from '@app/env';
    
    //Function that calculates de css to load
    export function getBrandCSS(styles: string[]): string [] {
        for(let i=0;i<styles.length;i++){
            styles[i] = './' + ENV.BRAND + '.' + styles[i];
        }
       return styles;
    }
    
    @Component({    
        templateUrl: './search.component.html',
        styleUrls: getBrandCSS(['search.component.css'])
    })
    export class SearchComponent {
        pageName = 'New Search Page';
        PropfavMovie = 'Gladiator';
    
        constructor(private _titleSrv: Title) {
            this._titleSrv.setTitle('Search page');
        }
    }
    

    这样你就可以拥有多个这样命名的css文件:

    > brand1.search.component.css
    > brand2.search.component.css
    > brand3.search.component.css
    > ***.search.component.css
    

    它们将根据 ENV var 值加载。您还可以编辑该函数以始终加载基本 CSS 和覆盖某些样式的特定 CSS。

    【讨论】:

    • 你试过运行它吗?因为,我认为我们不能为 styleUrls 使用函数。
    • 这实际上似乎可以工作stackblitz.com/edit/angular-5qf4xz?file=src/app/… 但我不知道当所有内容都被编译和捆绑后它是否也可以在生产/发布版本中工作
    • @capc0 你试过了吗?我非常想知道。
    • 我没试过
    • 我试过了。它不通过 ng build。
    猜你喜欢
    • 2018-03-12
    • 2019-05-04
    • 2017-07-15
    • 2018-01-04
    • 2018-04-10
    • 1970-01-01
    • 2016-11-07
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多