Я мог бы предложить другое решение, если вы уже знаете родительские компоненты.Вы можете использовать инъекцию родителей для каждого родителя, которого вы хотите перехватить внутри директивы.Таким образом, «директива ссылки» будет выглядеть следующим образом (вы должны реализовать то, что вам нужно):
import { Directive, HostListener, Input, Host, Inject, forwardRef,Optional } from '@angular/core';
import { FooterComponent } from './footer/footer.component';
import { NavbarComponent } from './navbar/navbar.component';
@Directive({
selector: 'a'
})
export class LinkDirective {
@HostListener('click') onMouseClick() {
this.showParent();
}
parent: FooterComponent | NavbarComponent;
constructor(@Optional() @Inject(forwardRef(() => FooterComponent)) private footer?: FooterComponent,
@Optional() @Inject(forwardRef(() => NavbarComponent)) navbar?: NavbarComponent) {
console.log(footer, navbar)
if(footer){
this.parent = footer;
}
if(navbar){
this.parent = navbar
}
if(!this.parent){
this.parent = null;
}
}
showParent(){
console.log(this.parent, (this.parent) ? this.getTagName(this.parent.constructor.name) : null);
}
getTagName(el: string){
return 'my-' + el.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
}
}
В этом случае я хочу посмотреть, находится ли тег 'a' внутри Navbar
илиFooter
, остальные компоненты в середине будут игнорироваться.У вас может быть проблема, если два компонента, которые вы хотите перехватить, находятся внутри другого, потому что оба будут внедрены внутри директивы, поэтому я не знаю, является ли это лучшим решением вашей проблемы, но в этом случае вы избегаетенапишите в каждой ссылке имя директивы.
Я сделал небольшой stackblitz , чтобы показать вам, как это работает.
Кстати, если вы уверены, чтокаждая ссылка является прямым потомком компонента, внедренного в вашу директиву. Вы можете добавить декоратор @Host()
до того, как @Optional()
вы получите такое поведение, и вы решите проблему с более чем одним внедрением для каждой ссылки:
NavbarComponent введен:
<my-navbar>
<a>Test</a>
</my-navbar>
NavbarComponent не введен:
<my-navbar>
<my-middle-component>
<a>Test</a>
</my-middle-component>
</my-navbar>