Comment puis-je accéder au " contenu " d'un composant à partir de la classe de composants elle-même?
J'aimerais faire quelque chose comme ça:
<upper>my text to transform to upper case</upper>
Comment puis-je obtenir le contenu ou la balise supérieure dans mon composant, comme je le ferais avec @Input
pour les attributs?
@Component({
selector: 'upper',
template: `<ng-content></ng-content>`
})
export class UpperComponent {
@Input
content: String;
}
PS: Je sais que je pourrais utiliser des tubes pour la transformation en majuscule. Ce n’est qu’un exemple. Je ne souhaite pas créer de composant supérieur, je sais juste comment accéder au contenu du composant à partir de la classe de composants.
Vous devez utiliser le décorateur @ContentChild
pour cela.
@Component({
selector: 'upper',
template: `<ng-content></ng-content>`
})
export class UpperComponent {
@Input
content: String;
@ContentChild(...)
element: any;
}
Modifier
J'ai étudié un peu plus votre problème et il n'est pas possible d'utiliser @ContentChild
ici car vous n'avez pas d'élément racine interne DOM.
Vous devez exploiter directement le DOM. Voici une solution de travail:
@Component({
selector: 'upper',
template: `<ng-content></ng-content>`
})
export class UpperComponent {
constructor(private elt:ElementRef, private renderer:Renderer) {
}
ngAfterViewInit() {
var textNode = this.elt.nativeElement.childNodes[0];
var textInput = textNode.nodeValue;
this.renderer.setText(textNode, textInput.toUpperCase());
}
}
Voir ce dossier pour plus de détails: https://plnkr.co/edit/KBxWOnyvLovboGWDGfat?p=preview
Si vous souhaitez obtenir une référence à un composant du contenu inclus, vous pouvez utiliser:
@Component({
selector: 'upper',
template: `<ng-content></ng-content>`
})
export class UpperComponent {
@ContentChild(SomeComponent) content: SomeComponent;
}
Si vous enveloppez <ng-content>
, vous pourrez accéder au contenu inclus comme
@Component({
selector: 'upper',
template: `
<div #contentWrapper>
<ng-content></ng-content>
</div>`
})
export class UpperComponent {
@ViewChild('contentWrapper') content: ElementRef;
ngAfterViewInit() {
console.debug(this.content.nativeElement);
}
}
class SomeDir implements AfterContentInit {
@ContentChildren(ChildDirective) contentChildren : QueryList<ChildDirective>;
ngAfterContentInit() {
// contentChildren is set
}
}
Notez que si vous utilisez console.log (contentChildren), cela ne fonctionnera que sur ngAfterContentInit ou un événement ultérieur.