-
-
Save tomastrajan/ee29cd8e180b14ce9bc120e2f7435db7 to your computer and use it in GitHub Desktop.
| import { OverlayContainer } from '@angular/cdk/overlay'; | |
| export class AppComponent implements OnInit { | |
| // use this to set correct theme class on app holder | |
| // eg: <div [class]="themeClass">...</div> | |
| themeClass: string; | |
| constructor( | |
| private overlayContainer: OverlayContainer | |
| ) {} | |
| ngOnInit(): void { | |
| // subscribe to some source of theme change events, then... | |
| this.themeClass = newThemeClass; | |
| // remove old theme class and add new theme class | |
| // we're removing any css class that contains '-theme' string but your theme classes can follow any pattern | |
| const overlayContainerClasses = this.overlayContainer.getContainerElement().classList; | |
| const themeClassesToRemove = Array.from(classList).filter((item: string) => item.includes('-theme')); | |
| if (themeClassesToRemove.length) { | |
| overlayContainerClasses.remove(...themeClassesToRemove); | |
| } | |
| overlayContainerClasses.add(newThemeClass); | |
| } | |
| } |
when I enter the ngOnInit() code in my component, it can't find names - newThemeClass, classList. And for the .remove , it shows the following error - [ts] Argument of type '{}' is not assignable to parameter of type 'string'.
this.themeClass = newThemeClass;
...
const themeClassesToRemove = Array.from(classList).filter((item: string) => item.includes('-theme'));
overlayContainerClasses.remove(...themeClassesToRemove);
overlayContainerClasses.add(newThemeClass);
Where should the classList be?
This should help in Angular 6 and Angular Material 6.x
import { Component, OnInit } from "@angular/core";
import { OverlayContainer } from "@angular/cdk/overlay";
@Component({
selector: 'ams-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
theme: string = 'my-dark-theme';
constructor(
private overlayContainer: OverlayContainer
) { }
ngOnInit(): void {
this.overlayContainer.getContainerElement().classList.add(this.theme);
}
onThemeChange(theme:string) {
this.theme = theme;
//console.log(theme);
const overlayContainerClasses = this.overlayContainer.getContainerElement().classList;
const themeClassesToRemove = Array.from(overlayContainerClasses).filter((item: string) => item.includes('-theme'));
if (themeClassesToRemove.length) {
overlayContainerClasses.remove(...themeClassesToRemove);
}
overlayContainerClasses.add(theme);
}
}
Thanks VladislavBaranov your insight was very helpful
I'm attempting to get this working. I created a demo using a mat-select and it looks like the theme class is not being added to the overlay container. I asked about this on both StackOverflow and the material repository. This is the issue link:
Anyone have any ideas?
The import OverlayContainer has changed recently as of material 5.x though.