javascripttypescriptangularangular2-directives

angular 2 access ng-content within component


How can I access the "content" of a component from within the component class itself?

I would like to do something like this:

<upper>my text to transform to upper case</upper>

How can I get the content or the upper tag within my component like I would use @Input for attributes?

@Component({
    selector: 'upper',
    template: `<ng-content></ng-content>`
})
export class UpperComponent {
    @Input 
    content: String;
}

PS: I know I could use pipes for the upper case transformation, this is only an example, I don't want to create an upper component, just know how to access the component's content from with the component class.


Solution

  • You need to leverage the @ContentChild decorator for this.

    @Component({
      selector: 'upper',
      template: `<ng-content></ng-content>`
    })
    export class UpperComponent {
      @Input 
      content: String;
    
      @ContentChild(...)
      element: any;
    }
    

    Edit

    I investigated a bit more your issue and it's not possible to use @ContentChild here since you don't have a root inner DOM element.

    You need to leverage the DOM directly. Here is a working solution:

    @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());
      }
    }
    

    See this plunkr for more details: https://plnkr.co/edit/KBxWOnyvLovboGWDGfat?p=preview