10 Common Mistakes to Avoid While Using Angular

10 Common Mistakes to Avoid While Using Angular

ARTICLE
09 Jan 2023

Angular is a fully-fledged framework that can aid development well due to its powerful features and highly structured architecture. Whether you are just starting or are a seasoned developer, the framework can be tricky to navigate. Developers typically trip up and commit these common angular mistakes that can slow down the development process and build unsatisfactory products.

In this article, we highlight the 10 most common Angular mistakes you can easily avoid with little effort:

1. Code Organization

In Angular development organizing, your code holds great value. This involves sectioning your code into logical components and modules for the ease of reusing, maintaining, and debugging. Angular, being built on MVC architecture, makes it tempting to dump code into your principal controller layer simply.

Instead, make small compartments within the layer for each aspect of your application. This makes it easier for a development team to work on the project and swiftly find bugs without sorting through a sea of haphazard code. 

2. Unsubscribing

An extremely common Angular mistake is forgetting to unsubscribe to a component. When you use the subscribe method on an observable, a Subscription object is created. This object is responsible for managing the observable’s lifecycle and can cause memory leaks if not handled properly.

To avoid this issue, make sure to unsubscribe from observables when they are no longer needed. This can be done by calling the unsubscribe method on the Subscription object or by using the takeUntil() operator.

Example for unsubscribing from an observable in Angular:

import { Component, Input, OnInit, OnDestroy } from '@angular/core';
import { FormControl } from '@angular/forms';
import { Subject     } from 'rxjs';
import { takeUntil   } from 'rxjs/operators';

@Component({
  selector: 'vbt-form-field-error',
  templateUrl: './form-field-error.component.html',
  styleUrls: ['./form-field-error.component.scss']
})
export class FormFieldErrorComponent implements OnInit, OnDestroy {

  @Input() formControler: FormControl;

  _unsubscribe: Subject<any> = new Subject();
    
  constructor() {}

  ngOnInit(): void {
    this.formControler.statusChanges
        .pipe(takeUntil(this._unsubscribe))
        .subscribe(res => {
      // ...
    });
  }

  ngOnDestroy(): void {
    this._unsubscribe.next();
    this._unsubscribeAll.complete();
  }
}

3. Using jQuery

jQuery is a library that aids in the easy manipulation of DOM. Angular is already equipped for DOM manipulation, thereby making using jQuery in Angular App Development redundant.

Such features in Angular are not superficially visible, and it takes studying the platform to search for the required features. Conclusively, using jQuery for Angular web development is not necessary and discouraged.

4. Direct DOM Modification

The Document Object Model (DOM) is the API that makes webpage content accessible for editing. Altering the DOM is something you must often do while working with Angular for reasons such as refreshing the title of a page due to a change in context, executing SVG or control, etc. 

Since more work goes into altering Angular templates to reflect these changes, developers tend to choose the easy way out and alter DOM directly. Angular’s templating system provides a clear separation between your application logic and the presentation of your data.

When you modify the DOM directly, this separation is lost, and it can be difficult to trace changes in the DOM to the code that caused them. Modifying can also interfere with Angular’s change detection mechanism. You can learn more about Change Detection here.

5. Incorrect Usage of Data Binding

Data Binding authorizes the synchronization of data between components and template or DOM. A common angular mistake is using one-way binding instead of two-way binding. Two way data binding uses the syntax: [()]. While other forms of one-way data binding uses syntax:

  • Event binding: ()
  • Property binding: ()
  • String interpolation: {{}}

For reference:

 Incorrect Usage of Data Binding

The mistake arises when the developer does not use binding syntax correctly for two-way binding. For example using () or [] instead of [()] for two-way binding. In one-way binding, the data flow from the component to the template. Changes made to the data in the template are not reflected in the component. This leads to inconsistencies in the application. Also, binding too much data to the template can make the application slow.

6. Mixing components and Service Responsibilities

In Angular App development, we can define components and services which depict different logic. Components control a part of the user interface, while services are responsible for providing specific functionality.

Consider the scenario where a component is responsible for making an HTTP request to the server to retrieve data. A service should handle the request while the component focuses on displaying the data. But if it also handles the request, it would be difficult to reuse the component in other parts of the application or modify the request itself in the future.

Example of an HTTP service to communicate with REST API:

@Injectable()
export class BaseHttpService<T, E extends ResponseModel> {

  private readonly restApiUrl = environment.restApiUrl;

  constructor(public http: HttpClient) {}
  
  updateEntity(entity: T): Observable<InquiryResponse<T>> {
    return this.http.post<InquiryResponse<T>>(`${this.restApiUrl}${this.controllerName}/UpdateEntity`, entity);
  }

  insertEntity(entity: T): Observable<InquiryResponse<T>> {
    return this.http.post<InquiryResponse<T>>(`${this.restApiUrl}${this.controllerName}/InsertEntity`, entity);
  }

  deleteEntity(id: number): Observable<ResponseModel> {
    return this.http.post<InquiryResponse<T>>(`${this.restApiUrl}${this.controllerName}/DeleteEntity/${id}`, {});
  }

  getEntityById(id: number): Observable<InquiryResponse<T>> {
    return this.http.get<InquiryResponse<T>>(`${this.restApiUrl}${this.controllerName}/GetEntityById/${id}`);
  }
}

7. Inappropriate Use of Event Handlers

Event handlers in Angular allow developers to specify what actions should be performed when a specific event is triggered. A typical mistake is linking an event handler to the wrong event resulting in maybe the event, not at all getting executed.

Another common angular mistake relating to event handling is failing to prevent the default behavior of the event. This might lead to unpredictable consequences. Additionally, incorrect usage of event handling can be prevented by using optimization techniques such as debouncing or throttling.

8. Not properly acknowledging Same Component in Multiple NgModules

A NgModule is a class that takes a metadata object and describes compiling and launching an application. A NgModule consists of Declarations Array, Imports Array, Providers Array, and Bootstrap Array.

For a component to be viewed by the user, it should be listed and acknowledged in the declarations array of a given NgModule. Otherwise, it won’t be visible in the UI.  If you want to list a component in more than one module, you should take into account the relation between the modules. If it is a parent-child relation, then you can:

  • Use the NgModule declaration of the child module to acknowledge the HeroCompoment within the module itself.
  • Export same component using NgModule Exports
  • To import child, use the import array of Parent NgModule

9.  Inability to Use the Available Tools

Angular has a rich ecosystem of third-party libraries and tools that can help you solve common problems and add powerful new features to your applications. Tools like Test Whiz and Protractor speed up testing.

Another tool is Batarang which is exceptionally helpful for debugging. Don’t shy away from these resources to improve your code and make your job as a developer easier.

10. Not using dependency injection properly.

Dependency injection is a core concept in Angular, and it’s important to understand how it works and use it properly. Dependency injection can be briefly defined as the process of creating an object from one class for some other classes to use.

It might not be properly executed due to:

  • Misspelling dependencies is a typical reason for Dependency Injection failures. For example using scope instead of $scope
  • Duplicate Module Declarations by referencing an existing module instead of an actual declaration.
    • Example of declaration of Module controllers:
      • angular.module(‘controllers’,[])  // ‘[]’ specifies dependency
    • Example of retrieving the module controllers:
      • angular.module(‘controllers’)  // No second parameter specifying dependency
  • Only constants and providers can be injected at the config stage. The rest of Angular services such as $http, $location, $timeout will fail and an error message will be displayed.

Conclusion

Overall, Angular is a powerful and versatile framework for building modern web applications, but it’s important to avoid common pitfalls and mistakes to ensure your code is clean, efficient, and maintainable. Nintriva provides excellent Angular development services with a team of highly experienced developers that can assist you in creating the most optimal version of your Angular application while avoiding usual oversight that comes with working on the platform.

Related blogs