如何在路由器插座创建的组件元素中应用css类?

时间:2016-01-07 00:19:16

标签: angular angular2-routing

我的DOM看起来像这样:

<app>
    <router-outlet></router-outlet>
    <project>...</project>
</app>

路由器插入project元素。

如何在此元素中添加类?

12 个答案:

答案 0 :(得分:37)

假设您始终希望将该类应用于此组件,则可以在组件元数据中使用host

@Component({
  selector:'project',
  host: {
      class:'classYouWantApplied`
  }
})

导致:

<app>
    <router-outlet></router-outlet>
    <project class="classYouWantApplied">...</project>
</app>

答案 1 :(得分:7)

关键是/deep/关键字:

    :host /deep/ router-outlet + project {
        display: block;
        border: 10px solid black;
    }

无需任何额外配置即可使用。

对于Angular Router动态创建的任何组件,

:host /deep/ router-outlet + *

编辑2018/3/5:

由于Angular 4.3.0已弃用/deep/,因此建议的替代方案为::ng-deep。关于此问题,有一个long discussion

答案 2 :(得分:6)

使用adjacent sibling selector*通配符选择紧随router-outlet之后的元素


styles.css

router-outlet + * {
  /* your css */
}

enter image description here

答案 3 :(得分:4)

您可以使用相邻的兄弟选择器

Gateway

https://developer.mozilla.org/en/docs/Web/CSS/Adjacent_sibling_selectors

但前提是@ drewmoore的方法并不适用。

答案 4 :(得分:4)

您可以使用HostBinding执行此操作,这与使用已提及的host属性实际上相同,尽管该方法会使用默认列表规则抛出TSLint错误。

在要应用课程的组件中:

import { Component, HostBinding, Host (optional for typing) } from '@angular/core';

@Component({...})
export class GiveMeAClassComponent {
    @HostBinding('class.some-class') someClass: Host = true;
    ...
}

然后在您的根styles.scss文件中,您可以添加以下内容:

.some-class {
    // Styles in here will now be applied to your GiveMeAClassComponent at a root level
}

答案 5 :(得分:1)

如果需要有条件地添加类,可以从组件中以编程方式添加它:

constructor(private renderer: Renderer2, private elemRef: ElementRef) {
  if(someCondition){
    renderer.addClass(elemRef.nativeElement, 'myClass');
  }
}

答案 6 :(得分:1)

<app>
  <div class="your css class">
   <router-outlet></router-outlet>
</div>
</app>

这对我有用

答案 7 :(得分:1)

由于路由器在router-outler元素之后注入了组件, 如果我们希望使用相同的规则集对所有注入的组件进行样式设置,则以下规则可能会有所帮助。

css“ +”运算符选择某种类型的第一个同级元素,而星号(*)用作通配符以选择路由器出口的任何第一个同级

router-outlet + * {
  // your rules
}

答案 8 :(得分:0)

当前,Angular 6建议我使用@HostBindings和@HostListeners代替host属性:

FID_1  Left_Ln  Right_Ln
    0       0        0
    1       0        0
    2       0        0
    3       0        0
    4       0        0
    5       0        0  (thousands of lines)

答案 9 :(得分:0)

我创建了一个RouterOutletHelperDirective,可以根据需要对其进行修改。

您的用例可能有所不同,但对我而言:

  • 我需要在每个路由器插座生成的项目上设置一组默认的类
  • 我需要根据某些条件(例如ActivatedRoute数据)防止此默认设置。

您可以像这样使用它(该类是可选的):

<router-outlet routerOutletHelper
               [routerOutletHelperClass]="'blue-border'"></router-outlet>

然后创建指令,将其添加并导出到您的应用模块。

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<HTMLElement>,
                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();
    }
}

答案 10 :(得分:0)

对我来说,这有助于将路由器出口包装到另一个容器中。

<div class="classYouWantApplied">
  <router-outlet>
</div>

像这样,您可以将类应用于周围的容器。

答案 11 :(得分:0)

添加宿主类名称,这将向组件添加一个类,然后使用相邻元素来定位元素。

@Component({
  selector:'project',
  host: {
      class:'Project-wrapper'
  }
})

现在使用 CSS 与 angular 相邻

::ng-deep to target it:
::ng-deep .Project-wrapper {}