How to apply css class to a component element when it's created by router-outlet?

前端 未结 11 1467
南旧
南旧 2020-12-15 15:41

I have DOM that looks something like this:


    
    ...

         


        
11条回答
  •  渐次进展
    2020-12-15 16:09

    I created a RouterOutletHelperDirective which can be modified as necessary.

    Your use-case may be different but for me :

    • I needed to set a default set of classes on each router-outlet generated item
    • I needed to prevent this default based on certain conditions, such as ActivatedRoute data.

    You use it like this (the class is optional):

    
    

    Then create the directive, add and export it to your app module.

    import { Directive, ElementRef, Renderer2, Input } from "@angular/core";
    import { RouterOutlet } from "@angular/router";
    import { Subscription } from "rxjs";
    
    @Directive({
        selector: 'router-outlet[routerOutletHelper]'
    })
    export class RouterOutletHelperDirective
    {
        constructor(private routerOutlet: RouterOutlet,
                    private element: ElementRef,
                    private renderer: Renderer2) { }
    
        subscription = new Subscription();
    
        @Input('routerOutletHelperClass')
        customClassName: string | undefined;
    
        ngOnInit() 
        {
            this.subscription.add(this.routerOutlet.activateEvents.subscribe((_evt: any) => {
    
                // find the component element that was just added
                const componentElement = this.element.nativeElement.nextSibling;
    
                // add a custom class
                if (this.customClassName) 
                {
                    this.renderer.addClass(componentElement, this.customClassName);
                }
    
                // add my default classes, unless the activated route data 
                // (specified in module routing file) has { addDefaultClasses: false }
                if (this.routerOutlet.activatedRouteData && this.routerOutlet.activatedRouteData.addDefaultClasses !== false)
                {
                    // these are my application's default classes (material / theming)
                    // (an additional data parameter could be 'darkTheme: boolean')
                    this.renderer.addClass(componentElement, 'mat-typography');
                    this.renderer.addClass(componentElement, 'rr-theme-light');
                }
            }));
        }
    
        ngOnDestroy()
        {    
            this.subscription.unsubscribe();
        }
    }
    

提交回复
热议问题