Ng Container Hack for Structural Directives

Angular: The Full Gamut Edition

Charlie Greenman
September 06, 2020
2 min read

Quirks with Structural Directives

In Angular there are two quirks with regards to structural directives:

<div *ngIf="showText"> 
  <p>This is text.</p>
  <p>This is more text.</p>
</div>
 <ul>
   <li *ngFor="let box of boxes" *ngIf="box.item === 'food'">{{ box.name
}}</li> 
</ul>

The quirk probably naturally arises, because for loops, and if statements weren’t meant to be used within a template. So if we think about it that way, wherein we can use some sort of Angular functionality, to bring it out of the DOM, it brings us to ng-container.


Understanding ng-container

In the Angular documentation, ng-container is specified as a way to group elements without introducing a new HTML element. Some of the examples mentioned include a <span> element that might introduce some accidental styling or attempting to put a <span> inside of a select element. ng-container will allow for to sidestep those issues, by not introducing a new element to the actual DOM. We can use the ng-container to solve the quirks we mentioned earlier:

<ng-container *ngIf="showText"> 
  <p>This is text.</p>
  <p>This is more text.</p>
</ng-container>

Here, by introducing an ng-container, we no longer have to introduce a new div, if we want the content to show conditionally. Likewise, to solve the issue we had before of being able to use two structural directives, we can do the following:

<ul>
  <ng-container *ngFor="let box of boxes">
    <ng-container *ngIf="box.item === 'food'"> 
      <li>{{ box.name }}</li>
    </ng-container> 
  </ng-container>
</ul>

We could technically apply the *ngIf on the li element itself, for consistency sake. If I had a team member that preferred otherwise, I would be more than happy with that. It is just my preference to apply logic on an ng-container.

More articles similar to this

footer

Razroo is committed towards contributing to open source. Take the pledge towards open source by tweeting, #itaketherazroopledge to @_Razroo on twitter. One of our associates will get back to you and set you up with an open source project to work on.