Bird
Raised Fist0
Angularframework~5 mins

@ViewChild decorator usage in Angular

Choose your learning style10 modes available
Introduction

The @ViewChild decorator helps you get a reference to a part of your template inside your component code. This lets you work with that part directly, like changing its properties or calling its methods.

You want to change a button's text or style after the page loads.
You need to call a method on a child component from the parent component.
You want to focus an input box automatically when the page appears.
You want to read or change a DOM element's value or property in your component.
You want to listen to events or access properties of a template element.
Syntax
Angular
import { ViewChild, ElementRef } from '@angular/core';

@Component({ ... })
export class MyComponent {
  @ViewChild('templateRefName') elementRef!: ElementRef;

  ngAfterViewInit() {
    // Use this.elementRef here
  }
}

The string inside @ViewChild('templateRefName') matches the template reference variable in your HTML.

You usually access the element inside ngAfterViewInit() lifecycle hook to ensure the view is ready.

Examples
Access a button element by its template reference and change its text.
Angular
@ViewChild('myButton') button!: ElementRef<HTMLButtonElement>;

ngAfterViewInit() {
  this.button.nativeElement.textContent = 'Clicked!';
}
Get a reference to a child component instance and call its method.
Angular
@ViewChild(ChildComponent) childComp!: ChildComponent;

ngAfterViewInit() {
  this.childComp.someMethod();
}
Focus an input box programmatically using @ViewChild.
Angular
@ViewChild('inputBox') input!: ElementRef<HTMLInputElement>;

focusInput() {
  this.input.nativeElement.focus();
}
Sample Program

This component uses @ViewChild to get references to a button and an input box. After the view loads, it changes the button text and focuses the input box automatically.

Angular
import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <button #myBtn>Click me</button>
    <input #myInput type="text" placeholder="Type here" />
  `
})
export class AppComponent implements AfterViewInit {
  @ViewChild('myBtn') button!: ElementRef<HTMLButtonElement>;
  @ViewChild('myInput') input!: ElementRef<HTMLInputElement>;

  ngAfterViewInit() {
    this.button.nativeElement.textContent = 'Ready to click';
    this.input.nativeElement.focus();
  }
}
OutputSuccess
Important Notes

Always use ngAfterViewInit to access @ViewChild elements because the view is not ready in the constructor or ngOnInit.

If the element or component might not exist, use the { static: false } option (default) to avoid errors.

You can also use @ViewChild with a component class to get its instance, not just DOM elements.

Summary

@ViewChild lets you get a direct reference to a template element or child component.

Use it to change element properties, call child methods, or control focus.

Access the reference safely inside ngAfterViewInit lifecycle hook.

Practice

(1/5)
1. What is the primary purpose of the @ViewChild decorator in Angular?
easy
A. To get a reference to a template element or child component
B. To create a new Angular module
C. To define routes in the application
D. To style components dynamically

Solution

  1. Step 1: Understand the role of @ViewChild

    @ViewChild is used to access a child element or component from the template directly in the class.
  2. Step 2: Compare with other options

    Creating modules, defining routes, or styling are unrelated to @ViewChild's purpose.
  3. Final Answer:

    To get a reference to a template element or child component -> Option A
  4. Quick Check:

    @ViewChild = Reference to template element [OK]
Hint: Remember: @ViewChild grabs template elements or child components [OK]
Common Mistakes:
  • Confusing @ViewChild with routing or module decorators
  • Thinking @ViewChild creates components
  • Assuming @ViewChild styles elements
2. Which of the following is the correct syntax to use @ViewChild to get a reference to a template element with template variable #myInput?
easy
A. @ViewChild(myInput) inputElement: ElementRef;
B. @ViewChild('myInput') inputElement: ElementRef;
C. @ViewChild(#myInput) inputElement: ElementRef;
D. @ViewChild('inputElement') myInput: ElementRef;

Solution

  1. Step 1: Check correct string usage in @ViewChild

    The template variable name must be passed as a string, so it should be '@ViewChild('myInput')'.
  2. Step 2: Validate variable names and types

    The variable name in the class can be anything, here 'inputElement', and type should be ElementRef for native elements.
  3. Final Answer:

    @ViewChild('myInput') inputElement: ElementRef; -> Option B
  4. Quick Check:

    Template variable name as string in @ViewChild [OK]
Hint: Always pass template variable name as a string in @ViewChild [OK]
Common Mistakes:
  • Omitting quotes around template variable name
  • Using # inside @ViewChild argument
  • Swapping variable names and template references
3. Given the following Angular component code, what will be logged to the console after the view initializes?
  <input #myInput type="text" value="Hello">

  export class MyComponent implements AfterViewInit {
    @ViewChild('myInput') inputRef!: ElementRef<HTMLInputElement>;

    ngAfterViewInit() {
      console.log(this.inputRef.nativeElement.value);
    }
  }
medium
A. undefined
B. Error: inputRef is undefined
C. null
D. Hello

Solution

  1. Step 1: Understand @ViewChild and ngAfterViewInit timing

    @ViewChild gets the input element reference, and ngAfterViewInit runs after the view is ready, so inputRef is defined.
  2. Step 2: Access nativeElement value

    inputRef.nativeElement.value accesses the input's value attribute, which is 'Hello'.
  3. Final Answer:

    Hello -> Option D
  4. Quick Check:

    Access input value via @ViewChild after view init [OK]
Hint: Access @ViewChild only after ngAfterViewInit to get values [OK]
Common Mistakes:
  • Trying to access @ViewChild in constructor or ngOnInit
  • Assuming inputRef is null or undefined after view init
  • Confusing nativeElement with the ElementRef itself
4. Identify the error in the following Angular component code using @ViewChild:
  export class MyComponent {
    @ViewChild('myButton') buttonRef: ElementRef;

    ngOnInit() {
      this.buttonRef.nativeElement.click();
    }
  }
medium
A. Accessing @ViewChild reference before view initialization
B. Missing quotes around 'myButton' in @ViewChild
C. Using ElementRef instead of TemplateRef
D. No error, code is correct

Solution

  1. Step 1: Check lifecycle hook used

    ngOnInit runs before the view is fully initialized, so @ViewChild references are not ready yet.
  2. Step 2: Correct lifecycle hook for @ViewChild access

    Accessing @ViewChild should be done in ngAfterViewInit to ensure the element exists.
  3. Final Answer:

    Accessing @ViewChild reference before view initialization -> Option A
  4. Quick Check:

    @ViewChild ready only after ngAfterViewInit [OK]
Hint: Use ngAfterViewInit, not ngOnInit, to access @ViewChild [OK]
Common Mistakes:
  • Accessing @ViewChild in ngOnInit causing undefined errors
  • Confusing lifecycle hooks for view queries
  • Ignoring the timing of template element availability
5. You want to call a method focusInput() on a child component ChildComponent using @ViewChild. Which of the following is the correct way to do this safely after the view initializes?
hard
A. Use @ViewChild(ChildComponent) child: ElementRef; and call this.child.nativeElement.focusInput() inside ngAfterViewInit()
B. Use @ViewChild('child') child: ChildComponent; and call this.child.focusInput() inside constructor()
C. Use @ViewChild(ChildComponent) child!: ChildComponent; and call this.child.focusInput() inside ngAfterViewInit()
D. Use @ViewChild('child') child: ElementRef; and call this.child.focusInput() inside ngOnInit()

Solution

  1. Step 1: Correct @ViewChild usage for child component

    Use the component class type in @ViewChild to get the child component instance, e.g. @ViewChild(ChildComponent).
  2. Step 2: Call child method after view initialization

    Call the method inside ngAfterViewInit to ensure the child component is ready.
  3. Final Answer:

    Use @ViewChild(ChildComponent) child!: ChildComponent; and call this.child.focusInput() inside ngAfterViewInit() -> Option C
  4. Quick Check:

    Child component method call via @ViewChild after view init [OK]
Hint: Use component class in @ViewChild and call methods after ngAfterViewInit [OK]
Common Mistakes:
  • Calling child methods in constructor or ngOnInit
  • Using ElementRef instead of component class for child components
  • Trying to access nativeElement for component methods
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