Gaurav Mukherjee
Gaurav Mukherjee

Reputation: 6335

Access transcluded content

I have a componenet which i use to display a block of code which is transcluded in the component

<gs-code> console.log("Asd")</gs-code>

The component looks like this

code.component.ts

    @Component({
        selector: 'gs-code',
        providers: [],
        viewProviders: [],
        templateUrl: './code.component.html',
        styleUrls: ['./code.component.less']
    })
    export class GsCodeComponent {
        @Input() lang: string;
        @Input() currentLang: string;
        @ContentChild('content') content;
        copied(event) {
            console.log(event);
        }

        ngAfterContentInit() {
            console.log(this.content, "content");
        }
    }

code.component.html

<pre class="prettyprint">
   <ng-content #content></ng-content>
</pre>
<button class="btn btn-sm" title="Copy to clipboard" (click)="copied(content.innerHtml)"><i class="fa fa-clipboard"></i></button>

How can I get the transcluded text in the component? I have tried using contentChild and #content as the <ng-content #content></ng-content>. But these have not worked.

Upvotes: 4

Views: 7300

Answers (1)

G&#252;nter Z&#246;chbauer
G&#252;nter Z&#246;chbauer

Reputation: 657348

The <ng-content> element will never be added to the DOM itself, therefore adding a template variable and querying for it doesn't work.
You can wrap <ng-content> with another element and add the template variable there and query this element using @ViewChild().

Then you can just get the innerHTML of the wrapper element

@Component({
    selector: 'item',
    template: '<div #wrapper><ng-content></ng-content></div>'})
class Item implements AfterContentInit {

    @ViewChild('wrapper') wrapper:ElementRef;
    @Input() type:string = "type-goes-here";

    ngAfterContentInit() {
        console.log(this.wrapper.nativeElement.innerHTML); // or `wrapper.text`
    }
}

See also Get component child as string

Upvotes: 6

Related Questions