我想这样使用:
<v-button uppercase>test</v-button>
我的组件和指令如下:
@Component({
selector: "v-button",
template: "<button class="if component has uppercase directive set 'uppercase css class' here"></button>"
})
export class ButtonComponent{
}
@Directive({
selector : "[uppercase]"
})
export class UppercaseDirective{
}
我希望这样:
<button class="uppercase">test</button>
感谢帮助。
解决方案:感谢@Wand Maker给我小费
@Component({
selector: "v-button",
template: "<button #uppercaseFlag class="if component has uppercase directive set 'uppercase css class' here"></button>"
})
export class ButtonComponent{
@ViewChild('uppercaseFlag') uppercaseElement: ElementRef;
}
@Directive({
selector : "[uppercase]",
providers : [ButtonComponent]
})
export class UppercaseDirective{
ngAfterContentInit(): void {
this.renderer.addClass(this.button.uppercaseElement.nativeElement, "uppercase");
}
constructor(private readonly renderer: Renderer2, private readonly button: ButtonComponent) { }
}
答案 0 :(得分:1)
该指令需要访问button
子级并为其添加类属性。
为此,您可以在指令构造函数中注入ElementRef
以获得对宿主元素v-button
的引用,然后等待组件被初始化-之后在ngAfterContentInit
方法中可以将uppercase
样式分配给v-button
的第一个子元素-这将是一个button
元素。如果您确实更改了v-button
的模板,则可能必须调整部分代码。
这是指令代码:
@Directive({
selector : "[uppercase]"
})
export class UppercaseDirective implements AfterContentInit {
constructor(private el: ElementRef) {
}
ngAfterContentInit() {
this.el.nativeElement.children[0].className='uppercase';
}
}
此外,您可能还希望将v-button
模板更新为具有ng-content
,以便可以为按钮分配这样的文本/名称:
<v-button uppercase>Test</v-button>
以下是更新的组件代码:
@Component({
selector: "v-button",
template: "<button><ng-content></ng-content></button>"
})
export class ButtonComponent{
}