DEV Community

Rens Jaspers
Rens Jaspers

Posted on • Edited on

Uncluttering Angular Templates: Simplifying Asynchronous Data Loading with ngxLoadWith

When it comes to Angular development, creating well-structured, readable templates is a fundamental task. Good templates are about more than just aesthetics; they play a key role in ensuring your code is maintainable, debuggable, and extendable. However, dealing with asynchronous data loading in these templates can often lead to complex and cluttered structures, negatively impacting both the clarity of your code and the efficiency of your development process. This is where the *ngxLoadWith structural directive comes in. It offers a declarative and simple syntax that helps keep your templates clean and tidy, allowing you to focus more on the business logic and less on the mechanics of data loading.

The Traditional Approach

Traditionally, asynchronous data loading and management in Angular is often done using the async pipe and *ngIf directive. Let's look at an example:

<div *ngIf="todos$ | async as todos; else loadingOrError">
  <ul>
    <li *ngFor="let todo of todos">{{todo.title}}</li>
  </ul>
</div>

<ng-template #loadingOrError>
  <ng-container *ngIf="error$ | async as error; else loading">
    <p>Error: {{error.message}}</p>
  </ng-container>

  <ng-template #loading>
    <p>Loading...</p>
  </ng-template>
</ng-template>
Enter fullscreen mode Exit fullscreen mode

This approach certainly works, but as you can see, it quickly adds extra complexity to our template. We're manually handling loading states, catching errors, and our code starts to get nested and harder to read. In a real-world application, these templates can get much more complex, adding to the cognitive load of understanding and maintaining your code.

Simplifying Templates with ngxLoadWith

Now let's see how ngxLoadWith simplifies this process. Here's the equivalent template using ngxLoadWith:

<ul *ngxLoadWith="todos$ as todos; loadingTemplate: loading; errorTemplate: error">
  <li *ngFor="let todo of todos">{{todo.title}}</li>
</ul>
<ng-template #loading>Loading...</ng-template>
<ng-template #error let-error>Error: {{error.message}}</ng-template>
Enter fullscreen mode Exit fullscreen mode

In this example, the ngxLoadWith directive is managing our loading and error states. We no longer need to use the async pipe or *ngIf directive for this purpose. The loadingTemplate input is used to specify a template that should be displayed while our data is loading, and the errorTemplate provides an explicit place for error handling, reducing the complexity of our main template.

Conclusion

By using ngxLoadWith, you can drastically simplify your Angular templates. This makes them easier to understand, easier to maintain, and reduces the risk of mistakes that could lead to bugs. The library's straightforward syntax allows you to express complex asynchronous operations in a more intuitive way, allowing you to keep your focus on the unique aspects of your application.

Further Information and Resources

If you'd like to learn more about ngxLoadWith, you can visit the npm package page here, where you'll find more details and installation instructions.

You can also check out the library's GitHub page here. If you find ngxLoadWith useful, please consider giving the project a star on GitHub to show your support and help others discover this helpful resource.

Top comments (0)