2016-04-10 29 views
18

コンポーネントにスタイルシートにURLを動的に挿入することは可能ですか?角度2の動的スタイルのURL?

何かのように:

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

か(希望的観測と、これはちょうど偽のコードがあることに注意してください):

export class MyComponent implements dynamicUrls { 

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

あなたはつもりなしstylesheet1から特定のスタイルを上書きすることができている場合ので、それにアクセスすると、どうやってそれをするのですか?私の唯一のアイデアは、どういうわけかダイナミックなstyleUrlsですが、私はこれが私が見つけたものからも可能ではないと思います。

アイデア?

答えて

0

@Componentデコレータ内のクラスプロパティまたはメソッドにアクセスできないため、動的スタイルシートURLを使用できないと思います。

しかし、テンプレートにダイナミックなスタイルクラスを設定することで、目標を達成できます。

+0

などがここにhttp://stackoverflow.com/a/36516274/217408説明 –

+0

問題は、私が唯一のコンポーネント自分自身に、テンプレートへのアクセス権を持っていないということです。 – Chrillewoodz

+0

テンプレートにアクセスできないにもかかわらず、さまざまなスタイルを使いたい場合は、同じテンプレート(異なるスタイルシートを使用)で異なるコンポーネントを作成し、コンポーネントを動的にロードすることを検討してみましょう。 – siva636

1

私は動的にスタイルシートにURLを挿入する必要がありましたが、最終的に各変数css(私の場合は3種類のスタイル)のコンポーネントを空のテンプレートで初期化し、ngIf条件のアプリケーションコンポーネントで使用します。

プロパティ "encapsulation:ViewEncapsulation.None"の使用により、選択したコンポーネントのスタイルがページのヘッダーに追加され、ページ全体の正しいレンダラーを取得できるようになります。

+0

このアプローチの問題点は、Angularがヘッドに追加するスタイルは、コンポーネントが破棄されたときに自動的には削除されないということです。 –

-1

ngIf条件のhtmlテンプレートでスタイルシートリンクを使用しましたが、それは私のために働いていました。

<link rel='stylesheet' href="/stylesheets/classicTheme.css" *ngIf="theme === 'classic' " /> 
<link rel='stylesheet' href="/stylesheets/styleTheme.css" *ngIf="theme === 'style' " /> 
+0

これが実際にどのように機能するのかちょっと不思議ですね。 Angular 2の場合、 "app"は_root_要素の内部で実行されます(通常は ' 'の下にあります)。だから、あなたのコードは 'theme'変数にどのようにバインドできますか? –

+0

はコンポーネントのスタイルをオーバーライドしません – fdsfdsfdsfds

+0

私はさえできません...どのように動作するでしょうか? – rbnzdave

5

多分それは私のために働く可能性がありますハックの方法です。あなたはAngular 2 Componentデコレータを操作し、独自のものを作成し、あなたのプロパティでAngularのデコレータを返すことができます。

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

コンポーネントのデフォルト角度2 @コンポーネントを新しいコンポーネントに置き換えます。

import { CustomComponent } from 'path to CustomComponent'; 

@CustomComponent({ 
    selector: 'home', 
    templateUrl: './template/home.template.html', 
    styleUrls: [ './style/home.style.scss'] 
}) 
export class ...... 
+0

これはテストしましたか? – Chrillewoodz

+0

はい、これは私にとってうまく動作します。私はwebpackとAngular 2.0.0を使用しています – Virge

+0

よさそうです。後でそれをテストするつもりです。 – Chrillewoodz