javascript - Öppna Angular 6-länkar bundna av [innerHTML] i en ny flik
Jag har en Angular 6-app med en <div> som fylls via en [innerHTML]-bindning. Hur kan jag applicera target='_blank' på alla länkar inne i denna div?
Vad jag har försökt:
Hittills har jag försökt skapa en direktiv som omsluter div:en och, efter att ändringsdetektering körts, hämtar en lista över barn-<a>-taggar och applicerar ett target='_blank'-attribut. Hittills har jag inte kunnat få ContentChildren att komma åt någon av länkarna: det hämtar bara upp en tom lista.
Har någon erfarenhet av att göra detta, eller finns det en mer elegant lösning?
@Directive({
selector: '[appExternalLink]'
})
export class ExternalLinkDirective implements AfterContentChecked, AfterViewChecked {
@ContentChildren('a', {descendants: true}) links: QueryList<any>;
@Input() appExternalLink: string;
constructor() {
console.log('HELLO FROM APPEXTERNALLINK');
}
ngAfterContentChecked() {
console.log(this.links);
}
}
Sedan, när du binder innehållet:
<div appExternalLink>
<div [innerHTML]="content"></div>
</div>
Svar #1
Det visar sig att jag använde fel tillvägagångssätt när jag försökte använda ContentChildren.
Med koden nedan kunde jag rikta in mig på alla <a>-taggar i en div med appExternalLink-direktivet. Jag postar min lösning så att andra inte behöver lista ut detta själva:
import { AfterViewChecked, Directive, ElementRef } from '@angular/core';
@Directive({
selector: '[appExternalLink]'
})
export class ExternalLinkDirective implements AfterViewChecked {
constructor(private el: ElementRef) { }
ngAfterViewChecked() {
Array.from(this.el.nativeElement.querySelectorAll('a'))
.forEach((el: any) => {
el.setAttribute('target', '_blank');
});
}
}
Svar #2
Du kan använda <base>-taggen för att ange standardvärdet för target-attributet för varje ankare.
<base target="_blank">
Du kan injicera denna tagg dynamiskt i ngOnInit och ta bort den i ngOnDestroy, men det kommer att ändra beteendet för vilken som helst länk.
Om du vill ändra beteendet hos enbart länkarna inne i en div kan du använda
Array.from(document.querySelectorAll('.your-div-class a'))
.forEach(el => el.setAttribute('target', '_blank'))
