Comment puis-je ajouter une classe à la balise body sans faire du corps le sélecteur d'application et utiliser la liaison d'hôte?
J'ai essayé d'utiliser le Renderer mais ça change tout le corps
Classe de liaison angulaire 2.x sur balise body
Je travaille sur une grande application angular2 et changer le sélecteur racine aura un impact sur beaucoup de code, je devrai changer beaucoup de code
Mon cas d'utilisation est le suivant:
Lorsque j'ouvre un composant modal (créé dynamiquement), je veux que la barre de défilement du document se masque
document.body.className|classList
?class
àbody
. Si vous n'utilisez pas de rendu de serveur ou de Web Worker, de quoi avez-vous peur?Réponses:
J'adorerais commenter. Mais à cause d'une réputation manquante, j'écris une réponse. Eh bien, je connais deux possibilités pour résoudre ce problème.
Eh bien et peut-être même mieux. Vous pouvez injecter le moteur de rendu ou le moteur de rendu 2 (sur NG4) et ajouter la classe avec le moteur de rendu.
MODIFIER POUR ANGULAIRE4:
la source
import { DOCUMENT } from '@angular/platform-browser'
this.renderer.addClass(document.body, 'modal-open');
etthis.renderer.removeClass(document.body, 'modal-open');
@Inject(DOCUMENT)
n'est plus nécessaire dans le constructeurJe pense que la meilleure façon de le faire est une combinaison des deux approches de 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 dépend pas fortement du
window.document
mais qui peut être remplacé dynamiquement (par exemple lors du rendu côté serveur). Donc, tout le code ressemblerait à ceci:la source