Angular2 add class to body tag

前端 未结 2 1744
误落风尘
误落风尘 2020-11-28 21:02

How can I add a class to the body tag without making the body as the app selector and using host binding?

I tried

相关标签:
2条回答
  • 2020-11-28 21:49

    I would love to comment. But due to missing reputation I write an answer. Well I know two possibilities to solve this issue.

    1. Inject the Global Document. Well it might not be the best practice as I don't know if nativescript etc supports that. But it is at least better than use pure JS.
    constructor(@Inject(DOCUMENT) private document: Document) {}
    
    ngOnInit(){
       this.document.body.classList.add('test');
    }
    
    

    Well and perhaps even better. You could inject the renderer or renderer 2 (on NG4) and add the class with the renderer.

    export class myModalComponent implements OnDestroy {
    
      constructor(private renderer: Renderer) {
        this.renderer.setElementClass(document.body, 'modal-open', true);
       }
    
      ngOnDestroy() {
        this.renderer.setElementClass(document.body, 'modal-open', false);
      }
    

    EDIT FOR ANGULAR4:

    import { Component, OnDestroy, Renderer2 } from '@angular/core';
    
    export class myModalComponent implements OnDestroy {
    
      constructor(private renderer: Renderer2) {
        this.renderer.addClass(document.body, 'modal-open');
       }
    
      ngOnDestroy() {
        this.renderer.removeClass(document.body, 'modal-open');
      }
    
    0 讨论(0)
  • 2020-11-28 21:54

    I think the best way to do it is a combination of both approaches by DaniS above: Using the renderer to actually set / remove the class, but also using the document injector, so it is not strongly dependant on the window.document but that can be replaced dynamically (e.g. when rendering server-side). So the whole code would look like this:

    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');
        }
    }
    
    0 讨论(0)
提交回复
热议问题