如何在 angular 4 及更高版本的组件上使用我自己的自定义指令
How to use my own custom directive on my component in angular 4 and above
我想这样使用:
<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) { }
}
该指令需要访问 button
子项并向其添加 class 属性。
为此,您可以在指令构造函数中注入 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
,这样按钮就可以像这样分配 text/name:
<v-button uppercase>Test</v-button>
这是更新的组件代码:
@Component({
selector: "v-button",
template: "<button><ng-content></ng-content></button>"
})
export class ButtonComponent{
}
我想这样使用:
<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) { }
}
该指令需要访问 button
子项并向其添加 class 属性。
为此,您可以在指令构造函数中注入 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
,这样按钮就可以像这样分配 text/name:
<v-button uppercase>Test</v-button>
这是更新的组件代码:
@Component({
selector: "v-button",
template: "<button><ng-content></ng-content></button>"
})
export class ButtonComponent{
}