Подтвердить что ты не робот

Angular 2.x связать класс с тегом body

Так как Angular 2.x загружается внутри тела, как добавить [class.fixed]="isFixed" в тег body (вне моего приложения)?

<html>
<head>
</head>
<body [class.fixed]="isFixed">
  <my-app>Loading...</my-app>
</body>
</html>

Мой компонент приложения выглядит как

import {Component} from 'angular2/core';
import {CORE_DIRECTIVES} from 'angular2/common';
import {RouteConfig, ROUTER_DIRECTIVES, Router, Location} from 'angular2/router';
import {About} from './components/about/about';
import {Test} from './components/test/test';

@Component({
    selector: 'my-app',
    providers: [],
    templateUrl: '/views/my-app.html',
    directives: [ROUTER_DIRECTIVES, CORE_DIRECTIVES],
    pipes: []
})

@RouteConfig([
    {path: '/about', name: 'About', component: About, useAsDefault: true},
    {path: '/test', name: 'Test', component: Test}
])

export class MyApp {
    router: Router;
    location: Location;

    constructor(router: Router, location: Location) {
        this.router = router;
        this.location = location;
    }
}
4b9b3361

Ответ 1

Использование <body> в качестве компонента приложения работает нормально, но вы не можете использовать привязку в теге <body>, потому что он пытается связать ` "isFixed" с родителем и родительский объект отсутствует.

Используйте @HostBinding вместо

@Component(
  selector: 'body',
  templateUrl: 'app_element.html'
)
class AppElement {
  @HostBinding('class.fixed') 
  bool isFixed = true;
}

Это код Дарта, но его сложно перевести в TS.

См. также @HostBinding и @HostListener: что они делают и для чего они нужны?

Вы всегда можете использовать простой JS для обновления DOM, если вы не зависите от рендеринга на стороне сервера или веб-работников.

В качестве альтернативы вы можете просто использовать

document.body.classList.add('foo');