Bird
Raised Fist0
Angularframework~5 mins

ngAfterContentInit for projected content in Angular - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is ngAfterContentInit in Angular?

ngAfterContentInit is a lifecycle hook that runs once after Angular projects external content into the component's view. It lets you act when the projected content is ready.

Click to reveal answer
beginner
When exactly does ngAfterContentInit run in relation to content projection?

It runs after Angular inserts the external content inside <ng-content> tags but before the view is fully rendered.

Click to reveal answer
intermediate
How do you access projected content inside ngAfterContentInit?

You use @ContentChild or @ContentChildren decorators to get references to the projected elements, then use them inside ngAfterContentInit.

Click to reveal answer
intermediate
Why can't you access projected content in the constructor or ngOnInit?

Because the projected content is not yet inserted into the component at those stages. ngAfterContentInit waits until projection is done.

Click to reveal answer
intermediate
Give a simple example of using ngAfterContentInit to log projected content.
<pre>import { Component, AfterContentInit, ContentChild, ElementRef } from '@angular/core';

export class MyComponent implements AfterContentInit {
  @ContentChild('projected') projectedContent!: ElementRef;

  ngAfterContentInit() {
    console.log('Projected content:', this.projectedContent.nativeElement.textContent);
  }
}</pre>
Click to reveal answer
When does ngAfterContentInit run in Angular?
AAfter projected content is inserted
BBefore constructor runs
CBefore <code>ngOnInit</code>
DAfter view is fully rendered
Which decorator is used to access projected content inside ngAfterContentInit?
A@ViewChild
B@ContentChild
C@Input
D@Output
Why can't you access projected content in ngOnInit?
ABecause <code>ngOnInit</code> is deprecated
BAngular forbids it
CIt causes errors
DContent is not projected yet
What Angular tag is used to mark where content is projected?
A<ng-template>
B<ng-container>
C<ng-content>
D<ng-project>
Which lifecycle hook runs after ngAfterContentInit?
AngAfterContentChecked
BngOnDestroy
CngOnChanges
DngAfterViewInit
Explain the purpose of ngAfterContentInit and how it relates to projected content in Angular.
Think about when Angular inserts external content into your component.
You got /4 concepts.
    Describe how you would use ngAfterContentInit to interact with content passed from a parent component.
    Focus on accessing and using the projected content.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of the ngAfterContentInit lifecycle hook in Angular?
      easy
      A. To run code after projected content has been inserted into the component
      B. To initialize component input properties
      C. To detect changes in component data bindings
      D. To clean up resources before the component is destroyed

      Solution

      1. Step 1: Understand the role of ngAfterContentInit

        This hook runs after Angular projects external content into the component's <ng-content> slot.
      2. Step 2: Identify when to use it

        It is used to safely access or manipulate the projected content once it is ready, not before.
      3. Final Answer:

        To run code after projected content has been inserted into the component -> Option A
      4. Quick Check:

        ngAfterContentInit = runs after projected content ready [OK]
      Hint: Remember: ngAfterContentInit runs after content projection is done [OK]
      Common Mistakes:
      • Confusing ngAfterContentInit with ngOnInit
      • Trying to access projected content before this hook
      • Using it to detect input property changes
      2. Which of the following is the correct way to implement ngAfterContentInit in an Angular component?
      easy
      A. ngAfterContentInit() { console.log('Content initialized'); }
      B. ngAfterContentInit: () => { console.log('Content initialized'); }
      C. ngAfterContentInit = function() { console.log('Content initialized'); }
      D. function ngAfterContentInit() { console.log('Content initialized'); }

      Solution

      1. Step 1: Recall Angular lifecycle hook syntax

        Lifecycle hooks are implemented as methods on the component class without assignment or arrow functions.
      2. Step 2: Check each option

        ngAfterContentInit() { console.log('Content initialized'); } uses the correct method syntax. Arrow functions or assignments are not valid lifecycle hook implementations. A standalone function is not a class method.
      3. Final Answer:

        ngAfterContentInit() { console.log('Content initialized'); } -> Option A
      4. Quick Check:

        Lifecycle hooks are class methods, not arrow functions [OK]
      Hint: Use method syntax without arrow functions for lifecycle hooks [OK]
      Common Mistakes:
      • Using arrow functions for lifecycle hooks
      • Defining lifecycle hooks outside the class
      • Assigning lifecycle hooks to variables
      3. Given the following Angular component code, what will be logged to the console when the component is initialized?
      import { Component, AfterContentInit, ContentChild, ElementRef } from '@angular/core';
      
      @Component({
        selector: 'child-comp',
        template: ``
      })
      export class ChildComp implements AfterContentInit {
        @ContentChild('projected') projectedContent!: ElementRef;
      
        ngAfterContentInit() {
          console.log(this.projectedContent.nativeElement.textContent.trim());
        }
      }
      
      // Usage in parent template:
      // 

      Hello World

      medium
      A. Error: Cannot read property 'nativeElement' of undefined
      B. undefined
      C. Hello World
      D. Empty string

      Solution

      1. Step 1: Understand ContentChild and ngAfterContentInit

        The @ContentChild('projected') decorator gets the element with template reference #projected projected inside <ng-content>. This is available after content initialization.
      2. Step 2: Check what ngAfterContentInit logs

        It logs the trimmed text content of the projected element, which is 'Hello World'.
      3. Final Answer:

        Hello World -> Option C
      4. Quick Check:

        ContentChild element text = 'Hello World' [OK]
      Hint: ContentChild is ready in ngAfterContentInit, so text logs correctly [OK]
      Common Mistakes:
      • Trying to access ContentChild before ngAfterContentInit
      • Forgetting to use template reference variable
      • Assuming projected content is undefined
      4. Consider this Angular component code snippet:
      import { Component, AfterContentInit, ContentChild, ElementRef } from '@angular/core';
      
      @Component({
        selector: 'proj-comp',
        template: ``
      })
      export class ProjComp implements AfterContentInit {
        @ContentChild('contentRef') content!: ElementRef;
      
        ngAfterContentInit() {
          console.log(this.content.nativeElement.textContent);
        }
      }

      When used as <proj-comp><p>Test</p></proj-comp>, what error will occur and why?
      medium
      A. Error: ngAfterContentInit is not called
      B. Error: content is undefined because no template reference variable 'contentRef' is present
      C. No error; logs 'Test' correctly
      D. Error: nativeElement is not accessible

      Solution

      1. Step 1: Analyze ContentChild selector

        The @ContentChild('contentRef') looks for an element with template reference variable #contentRef inside projected content.
      2. Step 2: Check usage in parent template

        The projected <p>Test</p> has no #contentRef variable, so content is undefined.
      3. Step 3: Understand consequence in ngAfterContentInit

        Accessing this.content.nativeElement causes a runtime error because content is undefined.
      4. Final Answer:

        Error: content is undefined because no template reference variable 'contentRef' is present -> Option B
      5. Quick Check:

        Missing template ref causes undefined ContentChild [OK]
      Hint: ContentChild needs matching template ref; else undefined error [OK]
      Common Mistakes:
      • Assuming ContentChild finds elements without template refs
      • Ignoring runtime errors from undefined properties
      • Confusing ngAfterContentInit with ngOnInit timing
      5. You want to create a component that projects a list of items and highlights the first projected item after content initialization. Which approach correctly uses ngAfterContentInit to achieve this?
      import { Component, AfterContentInit, ContentChildren, QueryList, ElementRef } from '@angular/core';
      
      @Component({
        selector: 'highlight-list',
        template: ``
      })
      export class HighlightList implements AfterContentInit {
        @ContentChildren('item') items!: QueryList<ElementRef>;
      
        ngAfterContentInit() {
          // What should go here?
        }
      }

      Options for ngAfterContentInit implementation:
      hard
      A. document.querySelector('item').style.backgroundColor = 'yellow';
      B. this.items.nativeElement.style.backgroundColor = 'yellow';
      C. this.items[0].nativeElement.style.backgroundColor = 'yellow';
      D. this.items.first.nativeElement.style.backgroundColor = 'yellow';

      Solution

      1. Step 1: Understand ContentChildren and QueryList

        @ContentChildren('item') collects all projected elements with template ref #item into a QueryList. Access the first element with items.first.
      2. Step 2: Apply style to first projected item

        Use items.first.nativeElement.style.backgroundColor to highlight the first item safely after content is initialized.
      3. Step 3: Evaluate other options

        this.items.nativeElement.style.backgroundColor = 'yellow'; is invalid because QueryList has no nativeElement property. this.items[0].nativeElement.style.backgroundColor = 'yellow'; is invalid because QueryList is not an array. document.querySelector('item').style.backgroundColor = 'yellow'; uses direct DOM query which breaks Angular encapsulation.
      4. Final Answer:

        this.items.first.nativeElement.style.backgroundColor = 'yellow'; -> Option D
      5. Quick Check:

        Use QueryList.first to access first projected element [OK]
      Hint: Use QueryList.first, not array or direct DOM, to access projected items [OK]
      Common Mistakes:
      • Treating QueryList as an array
      • Using direct DOM queries instead of Angular references
      • Accessing nativeElement on QueryList itself
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard