Angular 2 доступ к ng-содержимому в компоненте

Как я могу получить доступ к "контенту" компонента из самого класса компонента?

Я хотел бы сделать что-то вроде этого:

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

Как получить контент или верхний тег в моем компоненте, как я бы использовал @Input для атрибутов?

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

ps: Я знаю, что я мог бы использовать каналы для преобразования верхнего регистра, это только пример, я не хочу создавать верхний компонент, просто знаю, как получить доступ к содержимому компонента из класса компонента.

Ответы

Ответ 1

Для этого вам нужно использовать декоратор @ContentChild.

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

  @ContentChild(...)
  element: any;
}

Edit

Я немного исследовал вашу проблему, и здесь невозможно использовать @ContentChild, так как у вас нет корневого внутреннего элемента DOM.

Вам нужно использовать DOM напрямую. Вот рабочее решение:

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

Смотрите этот plunkr для более подробной информации: https://plnkr.co/edit/KBxWOnyvLovboGWDGfat?p=preview

Ответ 2

Если вы хотите получить ссылку на компонент переведенного содержимого, вы можете использовать:

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

Если вы завернете <ng-content>, вы можете получить доступ к трансидированному контенту, например

@Component({
    selector: 'upper',
    template: `
  <div #contentWrapper>
    <ng-content></ng-content>
  </div>`
})
export class UpperComponent {
    @ViewChild('contentWrapper') content: ElementRef;

    ngAfterViewInit() {
      console.debug(this.content.nativeElement);
    }
}