2016-04-15 12 views
1

私のアプリケーションでは、ユーザに日付を選択させるために、このlibraryを使用しています。 [「」]属性コンポーネントの適用されません。jsライブラリを使用するコンポーネントでCSSを適用する

@Component({ 
    selector: 'date-picker', 
    template: '<input type="text" class="form-control" id="{{id}}" />', 
    styles: [` 
     .test { 
      background-color: green; 
     } 
    `], 
}) 
export class DatePickerComponent implements OnInit, OnChanges { 
    public id: string; 

    @Input() public date: Date; 
    @Input() public disabled: boolean; 

    public ngOnInit() { 
     this.id = 'dp-' + new Date().getTime(); 
     window.setTimeout(() => this.initializeDatePicker()); 
    } 

    public ngOnChanges(changes: any) { 
     if (!this.pickerFunctions) 
      return; 

     var typedChanges = <DatePickerComponent>changes; 
     if (typedChanges.disabled) 
      this.setPickerDisabled(this.disabled); 
     if (typedChanges.date) 
      this.setPickerDate(this.date); 
    } 

    private initializeDatePicker() { 
     var element = jQuery('#' + this.id); 
     (<any>element).datetimepicker(); 
     element.on('dp.change', (e: any) => this.date = e.date.toDate()); 

     this.setPickerDate(this.date); 
     this.setPickerDisabled(this.disabled); 
    } 

    private setPickerDate(date: Date) { 
     this.pickerFunctions.date(date ? date : null); 
    } 

    private setPickerDisabled(disabled: boolean) { 
     if (disabled) 
      this.pickerFunctions.disable(); 
     else 
      this.pickerFunctions.enable(); 
    } 

    private get pickerFunctions(): any { 
     var element = jQuery('#' + this.id); 
     return element.data("DateTimePicker"); 
    } 
} 

問題はスタイルということです:

は、私はこのようなコンポーネントでそのブートストラップ・ウィジェットを包みました。

あなたはその理由を知っていますか?

私はCSSファイルをインポートしようとしましたが、このように動作しますが、コンポーネントを完全に再利用できるようにするためにスタイル属性を使用します。

おかげでたくさん

PS:それは、ライブラリのCSSが適用されないことも奇妙である..私は、私は、これは動作するはずだと思う正しく

<link href="bower_components/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css" /> 

答えて

2

それをインポートしています:

:host >>> .test { 
     background-color: green; 
    } 

ダイナミックに追加されたHTMLにクラスが適用されていないため、スタイルのカプセル化をエミュレートするために角度を使用するため、CSSは適用されません。 「シャドーピアシング」CSSコンビネータを使用すると、それを回避できます。

+0

ありがとう、このように動作します! 問題をよりよく説明する(またはリンクを追加する)ことができますか?また、 "シャドウピアス"とは何ですか?もう一度おねがいします – user3471528

+0

AngularはHTML要素に固有の生成クラス名を追加し、CSS内のセレクタを書き換えて、現在のコンポーネント内の要素にのみ一致させます。 HTMLを動的に追加すると、これらのクラスは追加されず、CSSは一致しません。シャドーピアシングコンビネータはシャドーDOMからのものです(ただし、Angularは現在直接サポートしています)。 '>>>'は、CSSセレクタがAngularによってどのように書き直されるかに影響します。このようにして、CSSセレクタは、独自のクラスが追加された異なる(または、あなたのケースではない)子コンポーネントへの選択性が低下します。 –

関連する問題