Reputation: 6335
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
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