136 votes

Angular2 ajoute une classe à la balise body

Comment ajouter un classe à la corps sans rendre la balise corps comme sélecteur d'application et en utilisant la liaison hôte ?

J'ai essayé d'utiliser le moteur de rendu, mais il modifie l'ensemble du corps.

Angular 2.x bind class on body tag

Je travaille sur une grosse application angular2 et changer le sélecteur Root va impacter beaucoup de code, je vais devoir changer beaucoup de code

Mon cas d'utilisation est le suivant :

Lorsque j'ouvre un composant modal (créé dynamiquement), je souhaite que la barre de défilement du document soit masquée.

1 votes

En fait, si vous travaillez avec des js dans une page html, quel est le problème avec l'utilisation de document.body.className|classList ?

0 votes

Haha si seulement c'était aussi simple :) mais c'est une mauvaise pratique d'accéder directement à dom

0 votes

Vous pouvez écrire un gros wrapper qui sera exécuté plusieurs secondes et qui, à la fin, ajoutera class à body . Si vous n'avez pas l'intention d'utiliser le rendu du serveur ou le travailleur web, de quoi avez-vous peur ?

286voto

DaniS Points 1536

J'aimerais faire un commentaire. Mais en raison du manque de réputation j'écris une réponse. Eh bien, je sais que deux possibilités pour résoudre ce problème.

  1. Injecter le Document Global. Eh bien, il pourrait ne pas être la meilleure pratique que je ne sais pas si nativescript etc prend en charge. Mais au moins, c'est mieux que de l'utiliser pur JS.
constructeur(@Inject(DOCUMENT) document: Document) {}

ngOnInit(){
c'.document.corps.classList.add('test');
}

Et peut-être même mieux. Vous pourrait injecter le convertisseur ou convertisseur 2 (sur CG4) et ajouter la classe avec le moteur de rendu.

l'exportation de la classe myModalComponent implémente OnDestroy {

 constructeur(privé convertisseur: Convertisseur) {
 c'.moteur de rendu.setElementClass(document.corps "modal-open', true);
}

 ngOnDestroy() {
 c'.moteur de rendu.setElementClass(document.corps "modal-open', false);
}

EDIT POUR ANGULAR4:

importer { Composant, OnDestroy, Renderer2 } '@angulaire de base";

l'exportation de la classe myModalComponent implémente OnDestroy {

 constructeur(privé moteur de rendu: Renderer2) {
 c'.moteur de rendu.addClass(document.corps "modal-ouvert");
}

 ngOnDestroy() {
 c'.moteur de rendu.removeClass(document.corps "modal-ouvert");
}

3 votes

Merci pour votre réponse, je pense que l'utilisation du moteur de rendu est la meilleure solution.

6 votes

Au cas où quelqu'un se demanderait où se procurer DOCUMENT, c'est : import { DOCUMENT } from '@angular/platform-browser'

15 votes

La solution du moteur de rendu est bien meilleure. Dans Angular 4, Renderer a été déprécié et remplacé par Renderer2. Le code devrait être modifié comme suit : this.renderer.addClass(document.body, 'modal-open'); et this.renderer.removeClass(document.body, 'modal-open');

79voto

David Points 31

Je pense que la meilleure façon de procéder est de combiner les deux approches proposées par DaniS ci-dessus : Utiliser le moteur de rendu pour définir/supprimer la classe, mais aussi utiliser l'injecteur de document, de sorte qu'il ne soit pas fortement dépendant de l'injecteur de document. window.document mais qui peut être remplacée dynamiquement (par exemple, lors du rendu côté serveur). L'ensemble du code ressemblerait donc à ceci :

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

13 votes

Merci, merci, merci, merci, merci, merci, merci, merci, merci :)

0 votes

Cela fonctionne très bien pour ajouter une classe de thème sombre à l'élément du corps !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X