Dynamic styleUrls in angular 2?

后端 未结 5 1553
借酒劲吻你
借酒劲吻你 2020-11-30 07:50

Is it possible to dynamically inject urls to stylesheets into a component?

Something like:

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


        
相关标签:
5条回答
  • 2020-11-30 07:58

    I don't think you can have dynamic stylesheet URLs, because you cannot access your class property or method inside @Component decorator.

    But you can achieve your goal by having dynamic style classes in your template.

    0 讨论(0)
  • 2020-11-30 07:59

    It's possible in some maybe hack way it worked for me. You can manipulate Angular 2 Component decorator, create your own and return Angular's decorator with your properties.

      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 );
        }
    

    And in your component replace default angular 2 @Component with new one.

    import { CustomComponent } from 'path to CustomComponent';
    
    @CustomComponent({
      selector: 'home',
      templateUrl: './template/home.template.html',
      styleUrls: [ './style/home.style.scss']
    })
    export class ......
    
    0 讨论(0)
  • 2020-11-30 08:02

    I have found a solution:
    1. I have changed the styleurls to styles in the component decorator.
    2. I will get my variable.
    3. I will use the require command in my decorator.

    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() { }
    
      }
    

    In this basic example I have imported the environment variable and changed the css string dynamically.

    0 讨论(0)
  • 2020-11-30 08:07

    I used to have the same need to dynamically inject urls to stylesheets and eventually ended to initialize a component for each variable css (in my case 3 differents styles) with empty template and use them in my app component with ngIf condition.

    Thanks to the use of property "encapsulation: ViewEncapsulation.None", the style of the selected component is then added to the header of the page and enable to get the correct renderer for the whole page.

    0 讨论(0)
  • 2020-11-30 08:21

    I used the stylesheet link in the html template with ngIf condition, it worked for me.

    <link rel='stylesheet' href="/stylesheets/classicTheme.css" *ngIf="theme === 'classic' " />
    <link rel='stylesheet' href="/stylesheets/styleTheme.css" *ngIf="theme === 'style' " />
    
    0 讨论(0)
提交回复
热议问题