angular 2 access ng-content within component

后端 未结 4 1967
半阙折子戏
半阙折子戏 2020-12-01 23:26

How can I access the \"content\" of a component from within the component class itself?

I would like to do something like this:

<         


        
相关标签:
4条回答
  • 2020-12-01 23:46

    You need to leverage the @ContentChild decorator for this.

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

    Edit

    I investigated a bit more your issue and it's not possible to use @ContentChild here since you don't have a root inner DOM element.

    You need to leverage the DOM directly. Here is a working solution:

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

    See this plunkr for more details: https://plnkr.co/edit/KBxWOnyvLovboGWDGfat?p=preview

    0 讨论(0)
  • 2020-12-01 23:50

    Good morning,

    I've been doing a little research on this topic because something similar has happened to me in my project. What I have discovered is that there are two decorators that can help you for this solution: ViewChildren and ContentChildren. The difference mainly according to what I have found in the network is that ViewChildren accesses the interior of the component and ContentChildren accesses the DOM or the component itself.

    To access the upper element from the ng-content you must change the upper element leaving it like this:

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

    And then simply to access the interior (In the component that has the ng-content):

      @ViewChildren('upper') upper: QueryList<ElementRef>
    

    And to access the component in general (In the component that has the ng-content):

      @ContentChildren('upper') upper: QueryList<ElementRef>
    

    Where did you get the information from: https://netbasal.com/understanding-viewchildren-contentchildren-and-querylist-in-angular-896b0c689f6e

    0 讨论(0)
  • 2020-12-01 23:50

    https://angular.io/api/core/ContentChildren

    class SomeDir implements AfterContentInit {
    
      @ContentChildren(ChildDirective) contentChildren : QueryList<ChildDirective>;
    
      ngAfterContentInit() {
        // contentChildren is set
      }
    }
    

    Note that if you do console.log(contentChildren), it will only work on ngAfterContentInit or a later event.

    0 讨论(0)
  • 2020-12-01 23:51

    If you want to get a reference to a component of the transcluded content, you can use:

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

    If you wrap <ng-content> then you can access access to the transcluded content like

    @Component({
        selector: 'upper',
        template: `
      <div #contentWrapper>
        <ng-content></ng-content>
      </div>`
    })
    export class UpperComponent {
        @ViewChild('contentWrapper') content: ElementRef;
    
        ngAfterViewInit() {
          console.debug(this.content.nativeElement);
        }
    }
    
    0 讨论(0)
提交回复
热议问题