Angular2はボディタグにクラスを追加します


97

ボディをアプリセレクターにしてホストバインディングを使用せずに、ボディタグにクラスを追加するにはどうすればよいですか?

レンダラーを使ってみましたが、全身が変わります

bodyタグのAngular 2.xバインドクラス

私は大きなangular2アプリで作業していて、ルートセレクターを変更すると多くのコードに影響し、多くのコードを変更する必要があります

私のユースケースはこれです:

動的に作成されたモーダルコンポーネントを開くと、ドキュメントのスクロールバーを非表示にしたい


1
実際にhtmlページ内でjsを使用している場合、使用の問題は何document.body.className|classListですか?
yurzui 2017

それはそれだけ簡単だったとしたら:)しかし、domに直接アクセスするのは悪い習慣です
Rachid O

あなたは、いくつかの秒を実行し、最後に追加されます大きなラッパー書くことができますclassにをbody。サーバーレンダリングまたはWebワーカーを使用しない場合、何が心配ですか?
yurzui 2017

これより良い解決策はありませんか?
Rachid O

4
ノー正当な理由のためにこれらのdownvote虐待の人々と密接な質問を理解することはできません
ラシッドOに

回答:


213

コメントしたいです。しかし、評判が足りないので、私は答えを書きます。この問題を解決する2つの可能性を知っています。

  1. グローバルドキュメントを挿入します。まあ、nativescriptなどがそれをサポートしているかどうかわからないので、ベストプラクティスではないかもしれません。しかし、それは少なくとも純粋なJSを使用するよりも優れています。
コンストラクター(@Inject(DOCUMENT)private document:Document){}

ngOnInit(){
   this.document.body.classList.add( 'test');
}

まあ、おそらくもっと良いです。レンダラーまたはレンダラー2(NG4上)を注入し、レンダラーでクラスを追加できます。

エクスポートクラスmyModalComponentはOnDestroy {

  コンストラクター(プライベートレンダラー:レンダラー){
    this.renderer.setElementClass(document.body、 'modal-open'、true);
   }

  ngOnDestroy(){
    this.renderer.setElementClass(document.body、 'modal-open'、false);
  }

ANGULAR4の編集:

'@ angular / core'から{Component、OnDestroy、Renderer2}をインポートします。

エクスポートクラスmyModalComponentはOnDestroy {

  コンストラクター(プライベートレンダラー:Renderer2){
    this.renderer.addClass(document.body、 'modal-open');
   }

  ngOnDestroy(){
    this.renderer.removeClass(document.body、 'modal-open');
  }

3
返事をありがとう、rendrerを使用するのが最良の解決策だと思います
Rachid O

6
:のドキュメントを取得する不思議場合誰も、中import { DOCUMENT } from '@angular/platform-browser'
Neph

14
レンダラーソリューションの方がはるかに優れています。Angular 4では、Rendererは非推奨になり、Renderer2に置き換えられました。コードは、に変更する必要があります: this.renderer.addClass(document.body, 'modal-open');this.renderer.removeClass(document.body, 'modal-open');
GreyBeardedGeek

3
また、@Inject(DOCUMENT)コンストラクターでは必要ありません
GreyBeardedGeek 2017

3
@Nephの更新として:プラットフォームブラウザーからのドキュメントのインポートは非​​推奨になりました。代わりに@ angular / commonを使用してください。
Pieter De Bie

36

私はそれを行うための最良の方法は、上記のDaniSによる両方のアプローチの組み合わせだと思います:レンダラーを使用して実際にクラスを設定/削除するだけでなく、ドキュメントインジェクターも使用するため、に強く依存してwindow.documentいませんが、動的に置き換えることができます(たとえば、サーバー側をレンダリングする場合)。したがって、コード全体は次のようになります。

import { DOCUMENT } from '@angular/common';
import { Component, Inject, OnDestroy, OnInit, Renderer2 } from '@angular/core';

@Component({ /* ... */ })
export class MyModalComponent implements OnInit, OnDestroy {
    constructor (
        @Inject(DOCUMENT) private document: Document,
        private renderer: Renderer2,
    ) { }

    ngOnInit(): void {
        this.renderer.addClass(this.document.body, 'embedded-body');
    }

    ngOnDestroy(): void {
        this.renderer.removeClass(this.document.body, 'embedded-body');
    }
}

8
ありがとう、ありがとう、ありがとう、ありがとう、ありがとう、ありがとう、ありがとう、ありがとう:)
Kamlesh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.