Как изменить класс body через корневой компонент?
@Component({
selector: "app",
directives: [ROUTER_DIRECTIVES],
template: `
<section class="header">
<h1>App</h1>
<router-outlet></router-outlet> `
})
Как изменить класс body через корневой компонент?
@Component({
selector: "app",
directives: [ROUTER_DIRECTIVES],
template: `
<section class="header">
<h1>App</h1>
<router-outlet></router-outlet> `
})
Один из способов, который не зависит от прямого манипулирования DOM, заключается в том, чтобы сделать тег <body>
элементом app с помощью body
в качестве селектора и использовать привязку хоста для обновления классов элементов приложения.
@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>`
}
}
Здесь вы можете просто использовать собственный JavaScript в компоненте Angular2, чтобы изменить класс тега <body>
: -
let body = document.getElementsByTagName('body')[0];
body.classList.remove("className"); //remove the class
body.classList.add("className"); //add the class
Ищем лучшее решение, вот мое текущее решение:
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);
}
}
i переустанавливаю его с помощью маршрутизации - например, -add к компоненту root-app этот код:
this.activeRouter.events.subscribe(
data => {
this.className = data.url.split('/').join(' ').trim();
this.changeBodyClass();
})
и смена тела:
changeBodyClass(){
if(this.el.nativeElement.parentElement.nodeName === 'BODY'){
this.el.nativeElement.parentElement.className = this.className ? this.className + '-page' : 'home-page';
}
вам нужно ввести в конструктор:
constructor(private activeRouter: Router,
private el: ElementRef)
Используйте код ниже.
ngOnInit() {
let body = document.getElementsByTagName('body')[0];
body.classList.add('body-landing');
}
ngOnDestroy() {
let body = document.getElementsByTagName('body')[0];
body.classList.remove("body-landing");
}
В случае, если кто-то должен добавить и удалить класс из тела только при активном конкретном компоненте, это можно сделать, как показано ниже. В моем конкретном случае я хотел добавить класс целевой страницы только тогда, когда пользователь приземляется на Home Page (View) и удаляет этот класс, когда пользователь переходит к другим представлениям:
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");
}
}