2016-08-23 3 views
5

私はアプリケーション全体で再利用したい汎用コンポーネントを持っています。問題は、サイトのさまざまな部分のスタイルを違うものにしたいということです。これは可能ですか?Angular 2で同じコンポーネントを異なるスタイルにすることはできますか?

私はstyleUrlのパスを渡す方法があると思っていますが、それは本当に乱雑に思えます、そして、私はもっと良い選択肢があると思っています。

私もこれを試してみましたが、それは動作しませんでした:コンポーネントを指定する場合、クラスに追加し、この

<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

あなたのcomponentをテーマにしたスタイルで:host-contextを使用することができます。

それ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

01についてもっと読みますここで
@Component({ 
    selector: 'my-test', 
    template: `<h3>Test Component</h3> 
    `, 
styleUrls : ['./app/test.css'] 
}) 
export class TestComponent { 
constructor(){} 
} 

Plunker!!

は、この情報がお役に立てば幸いです!

3

あなたは次のように@HostBinding()と組み合わせる:host(...)セレクタを使用することができます。

@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(...)セレクタlike

:host(.customStyle1) { 

その後、

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

この部分は必要ありませんが、あなたは、コンポーネントの他の構成設定とスタイリングを組み合わせたい場合は、この方法が有益であるかもしれません。

+0

それは面白いですが、my-compコンポーネントの中で可能なすべてのスタイルを定義する必要があります。これがダイナミックなやり方がありますか?さて、私はどこかでmy-compを使いたいので、必要なスタイルを定義してから ''テンプレート: 'を使うラッパーコンポーネントを作ることができます。' '' – David

+1

' :ng-deep'(以前は '/ deep /'だった) –

+0

これは良いとは言えますが、ドキュメントではこの機能では非推奨となっています。私はこれが、類似のコンポーネントを使用する異なる製品を持つ企業にとっては本当に共通の問題であると考えました。これに取り組むための「最良の」方法はありませんか? – David

関連する問題