Изменение инкапсуляции редко бывает полезным. Я бы создал службу состояний, которая изменяет классы и стили для компонентов.
Это должно выглядеть примерно так:
service
import { Injectable } from '@angular/core';
@Injectable()
export class StyleService {
private className: Subject<string> = new Subject<string>();
public className$: Observable<string> = this.className.asObservable();
set(className: string): any {
this.className.next(className);
}
}
Чтобы прослушивать изменения
...
private sub: Subscription;
...
this.sub = this.styleService.className$
.subscribe(class => {
// do what you need to do
})
...
ngOnDestroy() {
// so you dont have memory leaks
this.sub.unsubscribe();
}
Когда вы хотите изменить класс, вы просто вызываете функцию set. Единственное, чего не хватает, это объявления классов в основном файле стилей.
Если вам нужно иметь начальное значение className, вы можете использовать BehaviorSubject следующим образом:
private class: BehaviorSubject<string> = new BehaviorSubject<string>('className');