我的DOM看起来像这样:
<app>
<router-outlet></router-outlet>
<project>...</project>
</app>
路由器插入project
元素。
如何在此元素中添加类?
答案 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 + *
。
由于Angular 4.3.0已弃用/deep/
,因此建议的替代方案为::ng-deep
。关于此问题,有一个long discussion。
答案 2 :(得分:6)
使用adjacent sibling selector
和*
通配符选择紧随router-outlet
之后的元素
styles.css
router-outlet + * {
/* your css */
}
答案 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 {}