Tuesday, 13 June, 2017 UTC


Summary

ng-container is an element that’s available in Angular 2+ and that can act as the host to structural directives.
You can’t use more than one template binding on an element. So you can’t combine structural directives like this:
<!-- Can't do this --> <div *ngIf="todos" *ngFor="let todo of todos"> {{ todo.content }} </div> 
Instead what we usually do is use a wrapper like this:
<div *ngIf="todos"> <div *ngFor="let todo of todos"> {{ todo.content }} </div> </div> 
This is all well and good, but it adds a useless div element to the DOM. This is where the ng-container element becomes useful. The following behaves exactly the same, but without adding any extra element to the DOM at runtime:
<ng-container *ngIf="todos"> <div *ngFor="let todo of todos"> {{ todo.content }} </div> </ng-container> 
And this is also really useful when using ngIf on inline content to avoid the need for a bunch of span elements. This…
<div> <span *ngIf="error">Oops:</span> {{ message }} </div> 
…can also be used like this:
<div> <ng-container *ngIf="error">Oops:</ng-container> {{ message }} </div>
Avoiding the use of dumb span elements like that can help prevent having unwanted styles applied if some of your CSS rules would normally target them.

ng-container is not just a nicety, because in some cases your HTML markup wouldn’t be valid without it. This would output invalid HTML because only iu elements can be children of the ul element:
<ul> <div *ngFor="let todo of todos"> <li *ngIf="todo.content !== 'Get milk'"> {{ todo.content }} </li> </div> </ul> 
ng-container saves the day once again there because the following will produce valid HTML:
<ul> <ng-container *ngFor="let todo of todos"> <li *ngIf="todo.content !== 'Get milk'"> {{ todo.content }} </li> </ng-container> </ul>