angular 2 access ng-content внутри компонента

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

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

<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: Я знаю, что могу использовать трубы для преобразования верхнего регистра, это только пример, я не хочу создавать верхний компонент, просто знаю, как получить доступ к содержимое компонента из класса component.

2 ответов


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

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

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

редактировать

Я исследовал немного больше, и это не возможно, чтобы использовать @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());
  }
}

см. этот планкр для больше деталей:https://plnkr.co/edit/KBxWOnyvLovboGWDGfat?p=preview


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

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