2016-08-23 2 views
5

У меня есть общий компонент, который я хочу повторно использовать во всем приложении. Проблема в том, что я хочу по-разному стилизовать ее для разных частей сайта. Это возможно?Можно ли использовать один и тот же компонент, отличный от Angular 2?

Я предполагаю, что есть способ пройти путь для стиля Url, но это кажется действительно грязным, и я надеюсь, что есть лучшая альтернатива.

Я также попытался это, но он не работает: При указании компонента, добавьте в классе, что-то вроде этого

<generic-component class="customStyle1"></generic-component> 

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

+1

Вы можете добавить свойство customClass в компонент и указать, что вам нужно в каждом экземпляре. –

+0

Обновлен OP. Это ты имел в виду? Я пробовал, и это не сработало. – user3715648

+0

У вас могут быть проблемы с этим из-за [View Encapsulation] (https://angular.io/docs/ts/latest/guide/component-styles.html#!#view-encapsulation). Попробуйте указать его как None в компоненте или добавить пользовательские классы в файл main.css, не привязанный к определенному компоненту. –

ответ

3

Вы можете использовать :host-context в качестве темы для своего component на основе какого-либо класса, применяемого там, где он используется.

Подробнее об этом here!!

test.css

:host-context(.theme-green) h3 { 
    background-color: green; 
} 

:host-context(.theme-red) h3 { 
    background-color: red; 
} 

app.component

import { Component } from '@angular/core'; 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <h3 class="title">Basic Angular 2</h3> 
    <my-test class="theme-green" ></my-test> 
    <my-test class='theme-red' ></my-test> 
    ` 
}) 
export class AppComponent { 
    constructor(){} 
} 

test.component

@Component({ 
    selector: 'my-test', 
    template: `<h3>Test Component</h3> 
    `, 
styleUrls : ['./app/test.css'] 
}) 
export class TestComponent { 
constructor(){} 
} 

Вот Plunker!!

Надеется, что это помогает !!

3

Вы можете использовать :host(...) селектор в сочетании с @HostBinding() как:

@Component({ 
    selector: 'my-comp', 
    styles: ` 
    :host([type-default]) { 
    background-color: red; 
    } 

    :host([type-header]) { 
    background-color: blue; 
    } 

    :host([type-main]) { 
    background-color: green; 
    } 
` 
}) 
export class MyComponent { 
    @Input() 
    @HostBinding('component-type') 
    componentType:String="type-default" 
} 

, а затем переключить стиль как

<header> 
    <my-comp componentType="type-header"></my-comp> 
</header> 

<main> 
    <my-comp componentType="type-main"></my-comp> 
</main> 

<my-comp></my-comp> 

Вы также можете применить класс с внешней стороны, как в вашем вопросе, а затем использовать переключатель :host(...), такой как

:host(.customStyle1) { 

Тогда вам не нужна эта часть

@Input() 
    @HostBinding('component-type') 
    componentType:String="type-default" 

, но таким образом, может быть полезно, если вы хотите совместить стиль с другими параметрами конфигурации для компонента.

+0

Это интересно, но тогда вы должны определить все возможные стили внутри компонента my-comp. Был бы способ, чтобы это было динамично? Скажем, я хочу использовать my-comp где-нибудь, чтобы я мог создать компонент-оболочку, где я определяю стили, которые я хочу, а затем использовать '' 'template:' '' ' – David

+1

Вы можете стилизовать компонент извне, используя': : ng-deep' (был '/ deep /' ранее) –

+0

Выглядит хорошо, но в документации говорится, что это будет устаревать в этой функции. Я думал, что это будет очень распространенная проблема для компаний с разными продуктами, которые используют аналогичные компоненты. Разве нет «лучшего» способа справиться с этим? – David

Смежные вопросы