Угловая установка компонента styleUrls динамически

Я использую последнюю версию angualar 5.0 в новом проекте. И я новичок в этом фреймворке и был бы признателен за помощь от угловых разработчиков.

Я хотел бы установить свойство styleUrls с переменной уровня класса динамически во время выполнения. В моем случае путь styleURL будет поступать из базы данных через службу angular.

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

    }

Есть ли способ, которым я могу установить свойство styleUrls компонента в событии ngOnInit или из конструктора класса SearchComponent.

В моем случае у каждого клиента есть своя собственная таблица стилей. Поэтому мне нужно извлечь путь из таблицы стилей из базы данных и динамически заполнить свойство @components.

1 ответ

Я не эксперт, но не думаю, что то, о чем вы просите, возможно, учитывая то, как работает Angular.

Я считаю, что CSS, на который указывает styleUrls, или буквальный CSS, представленный в styles, передается компилятору шаблона (называемому Ivy в современном Angular) вместе с HTML-компонентом. Это создает "фабрику компонентов", которая используется для создания экземпляров компонентов во время выполнения. Фабрика может быть скомпилирована во время сборки (опережая время / AOT) или динамически на клиенте, но даже в последнем случае я думаю, что она компилируется при первоначальной загрузке владеющего модуля - если возможно скомпилировать новую фабрику на муха, я не видел никакого способа сделать это.

Я бы посоветовал создать отдельный модуль для каждого (типа) клиента, а затем найти, какой модуль использовать для этого клиента, и отложить его загрузку с помощью маршрутизатора. В качестве альтернативы, возможно, вы можете выделить общие части различных таблиц стилей в один статический лист и сделать остальную часть стиля динамической, используя ngClass условные.

Вы можете использовать функцию для динамического вычисления файла стиля для загрузки:

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. Вы также можете редактировать функцию, чтобы всегда загружать базовый CSS и тот, который переопределяет определенные стили.

Другие вопросы по тегам