Динамический стиль Urls в угловых 2?

Можно ли динамически внедрять URL-адреса в таблицы стилей в компонент?

Что-то вроде:

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

или (желаемое за действительное и обратите внимание, что это просто фальшивый код):

export class MyComponent implements dynamicUrls {

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

Потому что, если вы сможете переопределить определенные стили из stylesheet1 без доступа к нему, как вы должны это сделать? Моя единственная идея - иметь динамический styleUrls как-то, но я не думаю, что это даже возможно из того, что я мог найти.

Есть идеи?

5 ответов

Возможно, каким-то хакерским способом это сработало для меня. Вы можете манипулировать Angular 2 Component decorator, создавать свой собственный и возвращать Angular decorator со своими свойствами.

  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 ......

Я нашел решение:
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.

Раньше у меня была такая же потребность динамически вставлять URL-адреса в таблицы стилей, и в конце концов я закончил инициализацию компонента для каждой переменной css (в моем случае 3 разных стиля) с пустым шаблоном и использовал их в своем компоненте приложения с условием ngIf.

Благодаря использованию свойства "encapsulation: ViewEncapsulation.None" стиль выбранного компонента затем добавляется в заголовок страницы и позволяет получить правильный рендерер для всей страницы.

Я не думаю, что вы можете иметь динамические URL-адреса таблицы стилей, потому что вы не можете получить доступ к свойству класса или метод внутри @Component декоратор.

Но вы можете достичь своей цели, используя динамические классы стилей в своем шаблоне.

Я использовал ссылку на таблицу стилей в шаблоне html с условием ngIf, она работала для меня.

<link rel='stylesheet' href="/stylesheets/classicTheme.css" *ngIf="theme === 'classic' " />
<link rel='stylesheet' href="/stylesheets/styleTheme.css" *ngIf="theme === 'style' " />
Другие вопросы по тегам