styleurls style styles angular

styles - style - ¿Cómo cambio la clase de cuerpo a través de una clase de escritura de tipos(angular2)



angular styleurls (6)

¿Cómo cambio la clase de cuerpo a través del componente raíz?

@Component({ selector: "app", directives: [ROUTER_DIRECTIVES], template: ` <section class="header"> <h1>App</h1> <router-outlet></router-outlet> ` })


Aquí puede usar el JavaScript nativo en el componente Angular2 para cambiar la clase de la etiqueta <body> :

let body = document.getElementsByTagName(''body'')[0]; body.classList.remove("className"); //remove the class body.classList.add("className"); //add the class


En caso de que alguien necesite agregar y eliminar una clase del cuerpo solo cuando un componente específico esté activo, se puede hacer de la siguiente manera. En mi caso específico, quería agregar la clase " landing page " solo cuando el usuario llega a la página de inicio (vista) y eliminar esa clase cuando el usuario navega a otras vistas:

import {Component, OnInit, OnDestroy} from ''@angular/core''; export class HomeComponent implements OnInit { constructor() {} //Add the class to body tag when the View is initialized ngOnInit() { let body = document.getElementsByTagName(''body'')[0]; body.classList.add("landing-page"); } //Remove the class from body tag when the View is destroyed ngOnDestroy() { let body = document.getElementsByTagName(''body'')[0]; body.classList.remove("landing-page"); } }


Lo reproduzco mediante el uso del enrutamiento, como este -add al componente de la aplicación raíz este código:

this.activeRouter.events.subscribe( data => { this.className = data.url.split(''/'').join('' '').trim(); this.changeBodyClass(); })

y el cuerpo cambia:

changeBodyClass(){ if(this.el.nativeElement.parentElement.nodeName === ''BODY''){ this.el.nativeElement.parentElement.className = this.className ? this.className + ''-page'' : ''home-page''; }

Necesitas inyectar en el constractor:

constructor(private activeRouter: Router, private el: ElementRef)


Todavía en busca de una mejor solución, aquí está mi solución actual:

import { Component, OnInit, OnDestroy, ViewEncapsulation } from ''@angular/core''; @Component({ selector: ''signup'', templateUrl: ''./signup.component.html'', styleUrls: [''./signup.component.css'',], // Where my custom CSS styles for body element declared encapsulation: ViewEncapsulation.None, // That will not encapsulate my CSS styles (layout-full, page-signup) from signup.component.css inside component }) export class SignupComponent implements OnInit, OnDestroy{ bodyClasses:string = "layout-full page-signup"; ngOnInit(): void { $(''body'').addClass(this.bodyClasses); } ngOnDestroy() { $(''body'').removeClass(this.bodyClasses); } }


Una forma que no depende de la manipulación directa de DOM es hacer que la etiqueta <body> del elemento de la aplicación utilice el body como selector y use el enlace del host para actualizar las clases de elementos de la aplicación.

@Component({ selector: ''body'', host: {''[class.someClass]'':''someField''} }) export class AppElement implements AfterViewInit { someField: bool = false; // alternatively to the host parameter in `@Component` // @HostBinding(''class.someClass'') someField: bool = false; ngAfterViewInit() { someField = true; // set class `someClass` on `<body>` } }


Utilice el código de abajo.

ngOnInit() { let body = document.getElementsByTagName(''body'')[0]; body.classList.add(''body-landing''); } ngOnDestroy() { let body = document.getElementsByTagName(''body'')[0]; body.classList.remove("body-landing"); }