DEV Community

Vibhakar Kumar
Vibhakar Kumar

Posted on

๐—ป๐—ด-๐—ฐ๐—ผ๐—ป๐˜๐—ฎ๐—ถ๐—ป๐—ฒ๐—ฟ vs ๐—ป๐—ด-๐˜๐—ฒ๐—บ๐—ฝ๐—น๐—ฎ๐˜๐—ฒ in Angular : Key Differences Explained

When working with Angular's structural directives and conditional rendering, you'll frequently encounter both and . While they might seem similar at first glance, they serve distinct purposes in Angular applications.

Key Differences Between ng-container and ng-template

Image description

When to Use Each:

Use <ng-container> when:

  • You need to group elements without adding an extra DOM node

  • You want to apply multiple structural directives to a single element

  • You need a clean way to conditionally render content

Use <ng-template> when:

  • You need to define content that won't render immediately

  • You want to create reusable template fragments

  • You're working with structural directives like *ngIf, *ngFor, or *ngSwitch

  • You need to reference the template elsewhere in your component.

Code Examples
Basic ng-container Example

<!-- Grouping elements without extra DOM node -->
<ng-container>
  <h2>User Profile</h2>
  <p>Welcome back, {{user.name}}!</p>
</ng-container>

<!-- Using with *ngIf -->
<ng-container *ngIf="user.isAdmin">
  <button (click)="editProfile()">Edit Profile</button>
  <button (click)="deleteUser()">Delete User</button>
</ng-container>

<!-- Multiple structural directives -->
<div *ngFor="let item of items">
  <ng-container *ngIf="item.isActive">
    {{item.name}}
  </ng-container>
</div>
Enter fullscreen mode Exit fullscreen mode

Basic ng-template Example

<!-- Simple template definition -->
<ng-template #loadingTemplate>
  <div class="spinner">Loading...</div>
</ng-template>

<!-- Using with *ngIf else -->
<div *ngIf="dataLoaded; else loadingTemplate">
  Content loaded successfully!
</div>

<!-- Template reference with ViewChild -->
<ng-template #customTemplate let-name="name">
  <p>Hello, {{name}}!</p>
</ng-template>

<!-- Using ngTemplateOutlet -->
<ng-container *ngTemplateOutlet="customTemplate; context: {name: 'Alice'}"></ng-container>
Enter fullscreen mode Exit fullscreen mode

Advanced Usage Patterns
Dynamic Template Rendering

@Component({
  selector: 'app-dynamic',
  template: `
    <ng-container *ngTemplateOutlet="currentTemplate; context: ctx"></ng-container>
    <button (click)="toggleTemplate()">Toggle Template</button>

    <ng-template #template1 let-greeting="greeting">
      <h1>{{greeting}} from Template 1!</h1>
    </ng-template>

    <ng-template #template2 let-greeting="greeting">
      <h2>{{greeting}} from Template 2!</h2>
    </ng-template>
  `
})
export class DynamicComponent {
  @ViewChild('template1') template1: TemplateRef<any>;
  @ViewChild('template2') template2: TemplateRef<any>;

  currentTemplate: TemplateRef<any>;
  ctx = { greeting: 'Hello' };

  ngOnInit() {
    this.currentTemplate = this.template1;
  }

  toggleTemplate() {
    this.currentTemplate = 
      this.currentTemplate === this.template1 ? this.template2 : this.template1;
  }
}
Enter fullscreen mode Exit fullscreen mode

Content Projection with ng-container

@Component({
  selector: 'app-tab',
  template: `
    <div class="tab-container">
      <ng-container *ngIf="active" [ngTemplateOutlet]="contentTemplate"></ng-container>
    </div>
  `
})
export class TabComponent {
  @Input() active = false;
  @ContentChild('content') contentTemplate: TemplateRef<any>;
}

@Component({
  selector: 'app-tabs',
  template: `
    <app-tab [active]="true">
      <ng-template #content>
        <h3>First Tab Content</h3>
        <p>This is projected content using ng-template</p>
      </ng-template>
    </app-tab>
  `
})
export class TabsComponent {}
Enter fullscreen mode Exit fullscreen mode

Performance Considerations

  • ng-container: Has virtually no performance impact as it doesn't create DOM nodes

  • ng-template: Lightweight when not rendered, but instantiating templates has some overhead

  • Best practice: Use ng-container for simple grouping and ng-template for reusable/complex templates

Common Pitfalls

1.Assuming ng-template content renders by default: Remember, ng-template content is inert until explicitly rendered.

2.Overusing ng-container: Don't wrap every element in ng-container - only use when necessary for structural directives or logical grouping.

3.Context confusion: When using template context variables, ensure the property names match between the template definition and usage.

Conclusion:

Understanding the difference between ng-container and ng-template is crucial for writing clean, efficient Angular templates. While ng-container serves as an invisible grouping element, ng-template provides powerful capabilities for defining reusable template fragments. By using these elements appropriately, you can create more maintainable and performant Angular applications.

Thanks and Regards
Vibhakar Kumar
Software Engineer

Top comments (0)