Доступ к удаленному контенту

У меня есть компонент, который я использую для отображения блока кода, который заключен в компонент

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

Компонент выглядит следующим образом

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>

Как я могу получить переведенный текст в компонент? Я попытался использовать contentChild и #content как <ng-content #content></ng-content>. Но они не сработали.

Ответ 1

Элемент <ng-content> никогда не будет добавлен к самому DOM, поэтому добавление переменной шаблона и запрос на него не работают.
Вы можете обернуть <ng-content> другим элементом и добавить туда переменную шаблона и запросить этот элемент с помощью @ViewChild().

Затем вы можете просто получить innerHTML элемента оболочки

@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`
    }
}

См. также Получить компонент child как строку