【发布时间】:2020-07-04 07:29:50
【问题描述】:
我正在尝试制定一个指令来阻止另一个指令触发。我尝试同时使用结构性和非结构性指令来实现这一点,但它们都没有奏效。
我正在使用的简单 html:
<p appRemover appColor>
Start editing to see some magic happen :)
</p>
假设我有一个颜色指令,它只是将它应用到的元素的颜色属性更改为红色。这是颜色指令的代码:
constructor(private el: ElementRef) {}
ngAfterViewInit(): void {
this.el.nativeElement.style.color = 'red'
}
我将创建另一个指令,remover-directive,它将执行以下操作:
constructor(private el: ElementRef, private ren: Renderer2) { }
ngAfterViewInit(): void {
this.ren.removeAttribute(this.el.nativeElement, 'appColor');
}
这里的想法是我可以简单地在渲染之前从元素中删除指令。在删除 appColor 属性后打印 el.nativeElement 后,看起来该属性已消失,但颜色已变为红色。理想情况下,卸妆指令会在颜色指令之前触发,但我似乎无法找出 Angular 是如何选择顺序的。
我什至尝试了一个结构指令来解决这个问题:
constructor(private vc: ViewContainerRef, private template: TemplateRef<any>, private ren: Renderer2) { }
ngOnInit() {
this.ren.removeAttribute(this.template.elementRef.nativeElement, 'appColor');
this.vc.createEmbeddedView(this.template);
}
但这实际上会引发一个错误,说 el.removeAttribute 不是一个函数?
是否有一个既定的模式可用于使用指令来删除或阻止同一元素上的另一个指令触发?如果没有,有没有办法真正做到这一点?
【问题讨论】:
-
你为什么要这样做?为什么你不能让你的
appColor在某些条件下决定做某事? -
我试图有条件地渲染的指令在一个导入的库中,所以我不能对它进行这样的更改
标签: css angular attributes directive angular2-directives