Bird
Raised Fist0
Angularframework~5 mins

*ngFor for list rendering in Angular

Choose your learning style10 modes available
Introduction

*ngFor helps you show many items on the screen by repeating a template for each item in a list. It saves time and keeps your code clean.

You want to show a list of names or products on a webpage.
You have an array of messages and want to display each message in a chat app.
You want to create a menu where each option comes from a list.
You need to display a list of tasks or to-dos dynamically.
You want to show a gallery of images from an array of image URLs.
Syntax
Angular
<ul>
  <li *ngFor="let item of items">{{ item }}</li>
</ul>

The *ngFor directive repeats the <li> element for each item in the items array.

let item creates a variable for each element in the list during the loop.

Examples
Shows a list of fruits from the fruits array.
Angular
<ul>
  <li *ngFor="let fruit of fruits">{{ fruit }}</li>
</ul>
Shows a numbered list of user names using the index.
Angular
<ul>
  <li *ngFor="let user of users; index as i">{{ i + 1 }}. {{ user.name }}</li>
</ul>
Uses trackBy to optimize rendering when the list changes.
Angular
<ul>
  <li *ngFor="let color of colors; trackBy: trackByColor">{{ color }}</li>
</ul>
If the list is empty, nothing is shown because *ngFor does not render any elements.
Angular
<ul>
  <li *ngFor="let item of emptyList">No items found.</li>
</ul>
Sample Program

This component shows a heading and a list of fruits. The *ngFor repeats the <li> for each fruit in the fruits array.

Angular
import { Component } from '@angular/core';

@Component({
  selector: 'app-fruit-list',
  template: `
    <h2>Fruit List</h2>
    <ul>
      <li *ngFor="let fruit of fruits">{{ fruit }}</li>
    </ul>
  `
})
export class FruitListComponent {
  fruits = ['Apple', 'Banana', 'Cherry'];
}
OutputSuccess
Important Notes

Time complexity: Rendering takes time proportional to the number of items in the list.

Space complexity: Uses space for each repeated element in the DOM.

Common mistake: forgetting to use let before the variable name in *ngFor.

Use *ngFor when you want to display lists dynamically. For static content, just write HTML directly.

Summary

*ngFor repeats a template for each item in a list.

Use let item of items to access each element.

It helps keep your HTML clean and dynamic.

Practice

(1/5)
1. What does the Angular directive *ngFor="let item of items" do in a template?
easy
A. It repeats the HTML element for each item in the list called 'items'.
B. It creates a single HTML element and ignores the list.
C. It deletes all items from the list.
D. It sorts the list before displaying.

Solution

  1. Step 1: Understand the directive purpose

    The *ngFor directive is used to repeat an HTML element for each item in a list.
  2. Step 2: Analyze the syntax

    The syntax let item of items means for each element in the list 'items', create a copy of the element with 'item' as the current element.
  3. Final Answer:

    It repeats the HTML element for each item in the list called 'items'. -> Option A
  4. Quick Check:

    *ngFor repeats elements = A [OK]
Hint: Remember *ngFor repeats elements for each list item [OK]
Common Mistakes:
  • Thinking *ngFor modifies the list itself
  • Confusing *ngFor with event binding
  • Assuming it creates only one element
2. Which of the following is the correct syntax to use *ngFor to loop over a list named fruits?
easy
A. *ngFor="let fruit in fruits"
B. *ngFor="fruits as fruit"
C. *ngFor="fruit of fruits"
D. *ngFor="let fruit of fruits"

Solution

  1. Step 1: Recall correct Angular syntax

    The correct syntax for *ngFor uses let variable of list to iterate over the list.
  2. Step 2: Compare options

    *ngFor="let fruit of fruits" uses let fruit of fruits, which matches the correct syntax. *ngFor="let fruit in fruits" uses 'in' which is incorrect in Angular templates.
  3. Final Answer:

    *ngFor="let fruit of fruits" -> Option D
  4. Quick Check:

    Use 'of' not 'in' in *ngFor syntax = B [OK]
Hint: Use 'let item of list' syntax for *ngFor loops [OK]
Common Mistakes:
  • Using 'in' instead of 'of'
  • Omitting 'let' keyword
  • Swapping variable and list positions
3. Given the component code:
items = ['apple', 'banana', 'cherry'];

And the template:
<ul>
  <li *ngFor="let fruit of items">{{ fruit }}</li>
</ul>

What will be the rendered HTML output?
medium
A.
  • fruit
  • fruit
  • fruit
B.
  • items
C.
  • apple
  • banana
  • cherry
D.

    Solution

    1. Step 1: Understand the list and template

      The list 'items' contains three strings: 'apple', 'banana', and 'cherry'. The template uses *ngFor to create a
    2. for each fruit.
    3. Step 2: Render each item

      Each
    4. will display the current fruit's name. So the output is three
    5. elements with the fruit names inside a <ul>.
    6. Final Answer:

      <ul><li>apple</li><li>banana</li><li>cherry</li></ul> -> Option C
    7. Quick Check:

      *ngFor creates one element per list item = C [OK]
    Hint: Each list item creates one repeated element [OK]
    Common Mistakes:
    • Expecting variable names instead of values
    • Thinking *ngFor outputs the list name
    • Missing the repeated elements
    4. What is wrong with this Angular template snippet?
    <div *ngFor="item of items">{{ item }}</div>
    medium
    A. The list 'items' is not defined.
    B. The variable declaration is missing 'let' before 'item'.
    C. The interpolation syntax {{ item }} is incorrect.
    D. The *ngFor directive cannot be used on a <div> element.

    Solution

    1. Step 1: Check *ngFor syntax

      The correct syntax requires 'let' before the loop variable, so it should be *ngFor="let item of items".
    2. Step 2: Verify other parts

      The interpolation {{ item }} is correct, and *ngFor can be used on any element including <div>. The question does not mention if 'items' is defined, so we assume it is.
    3. Final Answer:

      The variable declaration is missing 'let' before 'item'. -> Option B
    4. Quick Check:

      Always use 'let' before variable in *ngFor = A [OK]
    Hint: Always write 'let' before the variable in *ngFor [OK]
    Common Mistakes:
    • Omitting 'let' keyword
    • Assuming *ngFor needs special elements
    • Confusing interpolation syntax
    5. You have a list of users with some having empty names:
    users = [{name: 'Alice'}, {name: ''}, {name: 'Bob'}, {name: null}];

    How can you use *ngFor to render only users with a non-empty, non-null name?
    hard
    A. *ngFor="let user of users" <div *ngIf="user.name">{{ user.name }}</div>
    B. *ngFor="let user of users | filter: user.name"
    C. *ngFor="let user of users" <div *ngIf="user.name !== ''">{{ user.name }}</div>
    D. *ngFor="let user of users" <ng-container *ngIf="user.name">{{ user.name }}</ng-container>

    Solution

    1. Step 1: Understand filtering in template

      Angular's *ngFor does not support filtering directly. We use *ngIf inside the loop to conditionally show elements.
    2. Step 2: Check conditions for non-empty names

      Using *ngIf="user.name" filters out empty strings and null values because they are falsy in Angular templates.
    3. Step 3: Compare options

      *ngFor="let user of users" <div *ngIf="user.name">{{ user.name }}</div> correctly uses *ngIf="user.name" inside the loop. *ngFor="let user of users" <ng-container *ngIf="user.name">{{ user.name }}</ng-container> has invalid syntax mixing *ngFor and *ngIf on the same element. *ngFor="let user of users | filter: user.name" uses a non-existent filter pipe. *ngFor="let user of users" <div *ngIf="user.name !== ''">{{ user.name }}</div> misses filtering null values.
    4. Final Answer:

      *ngFor="let user of users" <div *ngIf="user.name">{{ user.name }}</div> -> Option A
    5. Quick Check:

      Use *ngIf inside *ngFor to filter falsy names = D [OK]
    Hint: Use *ngIf inside *ngFor to skip empty or null items [OK]
    Common Mistakes:
    • Trying to filter list directly in *ngFor
    • Using invalid syntax combining *ngFor and *ngIf
    • Not filtering null values properly
    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