【问题标题】:Dynamic styleUrls in angular 2?角度2中的动态styleUrls?
【发布时间】:2016-07-31 14:23:06
【问题描述】:

是否可以将样式表的 url 动态注入到组件中?

类似:

styleUrls: [
  'stylesheet1.css',
  this.additionalUrls
]

或者(一厢情愿,注意这只是假代码):

export class MyComponent implements dynamicUrls {

  ngDynamicUrls() {
    this.inject(['anotherStylesheet.css', 'anotherStylesheet2.css']);
  }
}

因为如果您能够覆盖 stylesheet1 中的某些样式而无需访问它,您应该怎么做?我唯一的想法是以某种方式拥有动态styleUrls,但我认为这甚至是不可能的。

有什么想法吗?

【问题讨论】:

    标签: css angular


    【解决方案1】:

    我找到了解决办法:
    1.我在组件装饰器中将styleurls改为样式。
    2. 我会得到我的变量。
    3. 我将在我的装饰器中使用 require 命令。

    import { Component } from '@angular/core';
    import { environment } from '../environments/environment';
    let lang = environment['lang'];
    
    @Component({
       selector: 'app',
       templateUrl: './app.component.html',
       styles: [require('./app.component.css'), require('./app.component.' + lang + '.css')]
      })
    
      export class AppComponent {
    
       constructor() { }
    
      }
    

    在这个基本示例中,我已导入环境变量并动态更改 css 字符串。

    【讨论】:

    • 这是我的第一个答案是stackoverflow。我不明白为什么答案不好。你能解释一下吗? @Jean-FrançoisCorbett
    • 我很抱歉!该评论和标志是为了另一个答案,显然我以某种方式将它们放在这里。请忽略!你的回答刚刚好!我不确定我在看哪里。再次道歉。
    • @noahlubko 你在生产中试过了吗?我认为它不适用于 AOT 编译器。
    • 这绝对不适用于删除require 一步。我制作了一个带有基本组件类的模块,它还包括export const BASE_COMPONENT_STYLE = require("./base.component.css")。如果我尝试使用 styles: [BASE_COMPONENT_STYLE] 创建一个子类,Ivy 会抱怨“无法静态评估此表达式”——它无法解析 CSS 在编译期间
    【解决方案2】:

    它可能以某种黑客方式对我有用。您可以操作 Angular 2 组件装饰器,创建自己的装饰器并使用您的属性返回 Angular 的装饰器。

      import { Component } from '@angular/core';
    
        export interface IComponent {
          selector: string;
          template?: string;
          templateUrl?: string;
          styles?: string[];
          styleUrls?: string[];
          directives?: any;
          providers?: any;
          encapsulation?: number;
        }
    
        export function CustomComponent( properties: IComponent): Function {
          let aditionalStyles: string;
    
          try {
              aditionalStyles =  require(`path to aditional styles/${ properties.selector }/style/${        properties.selector }.${ GAME }.scss`);
              properties.styles.push(aditionalStyles);
            } catch (err) {
              console.warn(err)
            }
          }
    
          return Component( properties );
        }
    

    并在您的组件中将默认的 angular 2 @Component 替换为新的。

    import { CustomComponent } from 'path to CustomComponent';
    
    @CustomComponent({
      selector: 'home',
      templateUrl: './template/home.template.html',
      styleUrls: [ './style/home.style.scss']
    })
    export class ......
    

    【讨论】:

    • 你测试过这个吗?
    • 是的,这对我来说很好用。我正在使用 webpack 和 Angular 2.0.0
    • 那么@Chrillewoodz 你也试过了吗?考虑使用此实现,但可能只是为每种样式创建一个新组件并引用相同的 templateUrl 并从第三个模块导入所有脚本...
    • 是的,但是您仍然需要创建一个需要使用的组件预样式,例如,它不是一个从服务器接收样式名称的组件,不是真正的动态
    • 你放了一个额外的括号和未声明的 GAME var!
    【解决方案3】:

    我在带有 ngIf 条件的 html 模板中使用了样式表链接,它对我有用。

    <link rel='stylesheet' href="/stylesheets/classicTheme.css" *ngIf="theme === 'classic' " />
    <link rel='stylesheet' href="/stylesheets/styleTheme.css" *ngIf="theme === 'style' " />
    

    【讨论】:

    • 只是好奇这实际上是如何工作的?在 Angular 2 中,“app”在 root 元素内运行(通常位于 &lt;body&gt; 下)。那么,您的代码如何绑定到theme 变量?
    • 不覆盖组件的样式
    • 并不是说它会或不会工作,但是当每个人都认为他的应用程序运行的地方不会工作时,应用程序可以更改页面标题,对吗?必须有一些访问&lt;head&gt;部分。
    【解决方案4】:

    我曾经同样需要动态地将 url 注入样式表,并最终结束使用空模板为每个变量 css(在我的情况下为 3 种不同的样式)初始化一个组件,并在我的应用程序组件中使用 ngIf 条件。

    由于使用了属性“encapsulation: ViewEncapsulation.None”,所选组件的样式随后被添加到页面的标题中,并能够为整个页面获取正确的渲染器。

    【讨论】:

    • 这种方法的问题在于,Angular 添加到头部的样式在组件被销毁时不会自动删除。
    • 他们从来都不是。 Angular 永远不会删除样式。
    【解决方案5】:

    我认为您不能拥有动态样式表 URL,因为您无法访问 @Component 装饰器中的类属性或方法。

    但是您可以通过在模板中添加动态样式类来实现您的目标。

    【讨论】:

    • 问题是我无法访问模板,只能访问组件本身。
    • 好吧,如果您无法访问模板并且仍然希望拥有不同的样式,为什么不考虑使用相同的模板(具有不同的样式表)制作不同的组件并动态加载组件。跨度>
    • 这将是一个选项,但它仍然不提供完整的个人定制。似乎是他们真正需要解决的功能漏洞......
    • 动态样式类意味着 css 开销,而不是利用 sass 变量。对于每个新皮肤,您都将重复整个样式表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2018-01-03
    • 2017-12-27
    • 1970-01-01
    相关资源
    最近更新 更多