Avoid making API calls in every ngOnInit() function

I am currently developing an Angular front-end for a web-based application. One of the challenges I am facing is that all sub-page drill downs, implemented as different Angular components, make identical API calls in the ngOnInit() method. This repetitive calling is causing performance issues as the user traffic increases. I am seeking a solution to cache this data so that it can be utilized across multiple pages, thereby reducing the number of API requests.

ngOnInit() {
    if (this.api.validInputParams()) {
        this.api.getLiveData().subscribe((response) => {
            // Perform page-specific functionality and filtering

        }, (error) => {
            // Any errors should be handled by the HttpInterceptor
        });
    }
}

Answer №1

To effectively leverage the API, integrate it once at the top level component and connect with sub pages using @Input(), establishing one-way data binding. Start at the top level component :

top-component.ts (initiate the API call and store the results in a variable)

public response;

ngOnInit() {
  this.api.getData().subscribe(response => this.response = response);

top-component.html (pass the data to the sub-page)

<app-children [response]="response"></app-children>

sub-page (access the data from the input)

@Input() response;

Answer №2

One simple approach is to utilize 2-Way-DataBinding for passing them down easily. If that method isn't an option, a straightforward solution would be to store it in the local storage using

localStorage.setItem('data', JSON.stringify(yourData);
and for retrieval, you can utilize
yourData = JSON.parse(localStorage.getItem('data'));

Answer №3

To avoid unnecessary updates, store the data in your system and only retrieve it when needed instead of making repeated HTTP calls. Consider saving the timestamp of the last update, and only initiate a call if there has been a significant time difference since the last update.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Error message: In Angular 8 using Jest instead of Jasmine, there is no exported member called 'SpyObj'

I recently made a switch in my Angular CLI project from Karma to Jest by following this helpful tutorial. However, after the transition, I've noticed that some tests are passing while others are failing. One issue I encountered involves declaring a v ...

Issue encountered when attempting to display JSON index on individual result page

This is a JSON response. { "listing": { "id": "1", "name": "Institute Name", "contact": "9876543210", "website": "http://www.domain.in", "email": "<a href="/cdn-cgi/l/email-protection" class="__cf_email__" da ...

The navigate function fails to function properly in response to HttpClient

Hey there! I am facing an issue with the router.navigate function in Angular. When I try to use it within a subscribe method for httpClient, it doesn't seem to work as expected. Can someone please help me understand why this is happening and how I can ...

Previous states in TypeScript

Just starting out with typescript and trying to work with user files in order to update the state. Currently facing a typescript error that I can't seem to figure out - Error message: Argument of type '(prev: never[]) => any[]' is not as ...

Ignoring the NGRX Store selector override during testing appears to be happening

When overriding the selector to return null, the data is still returned as per the override set during initialization. Attempting to use setState did not yield results either. Testing the else condition in the following code block: this.store.pipe(select( ...

Bidirectional data binding of JSON object in Angular

As a newcomer to Angular, I am currently working with Angular v.8 and have a JSON map in my component. My goal is to use this map to generate input fields in HTML, with the keys as field labels and values as input values. Although I have successfully itera ...

Displaying [object Object] in Angular Material datatable

I am currently working on implementing a datatable component using Express and Firebase DB. Below is the service request data: getText() { return this.http.get<nomchamp[]>(this.url) .map(res => { console.log(res); return res }); ...

Create the correct structure for an AWS S3 bucket

My list consists of paths or locations that mirror the contents found in an AWS S3 bucket: const keysS3 = [ 'platform-tests/', 'platform-tests/datasets/', 'platform-tests/datasets/ra ...

Find the appropriate return type for a TypeScript function based on its argument

Is it feasible in TypeScript to infer the return type of a function based on its arguments? This feature would be beneficial when extracting specific properties from, for example, a database query. Here is an illustration (https://repl.it/repls/Irresponsi ...

What is the best way to export an overloaded function in TypeScript?

Trying to figure out how to overload a function in TypeScript so it can determine the type of arg2 based on the value of arg1. Arg1 has a list of known values. Here's a rough example of what I'm attempting: interface CatArgs {legs : number} int ...

Encountering obstacles when attempting to initiate a node application due to an error

Upon starting my node application, I encountered an error. The error message reads: "ERROR in Metadata version mismatch for module ../node_modules/@ng-bootstrap/ng-bootstrap/index.d.ts, found version 4, expected 3" Here is the full error trace: ERROR ...

Is it possible to determine the status of several angular components at once?

After following a tutorial to create a Tic-Tac-Toe app, I am now attempting to enhance its functionality independently. The draw condition is the current obstacle that I am facing. Each square in the tic-tac-toe grid is represented by its own Angular Comp ...

Enhance the visual appeal of incoming data using Angular Material's dynamic styling feature

Is it possible to enhance the text with some CSS styling to make each item stand out like in this example: https://i.stack.imgur.com/kSyZE.png I prefer not to include a cross button or provide users with the option to add tags. The data is coming from a R ...

Winston logs are unable to function within the Docker Container

I'm currently working on developing a nodejs/express app with typescript and have recently installed the winston package using npm install winston. I came across this helpful article that I've been following closely. Now, my goal is to dockerize ...

Reacting like sticky bottoms and tops

I'm working on a react/tailwind project that involves a component I want to be fixed at both the top and bottom of the screen. In simpler terms, there's an element that I need to always stay visible even when the user scrolls up or down the page ...

utilize makeStyles to modify button text color

Initially, my button was styled like this: style={{ background: '#6c74cc', borderRadius: 3, border: 0, color: 'white', height: 48, padding: '0 30px', }}> It worke ...

Enhancing the NextPage Typescript Type: A Step-by-Step Guide

I'm working on a NextJS dashboard with role-based access control and I need to pass an auth object to each page from the default export. Here's an image showing an example of code for the Student Dashboard Home Page: Code Example of Student Dashb ...

Repeating the same algorithms in both the back and front ends while applying Domain Driven Design

Within my class, I have some backend calculations: public class MyDomainClass{ private Double amount; private Double total; public Double getPercentage(){ /*business logic*/ } } I am using Angular 2+ for my frontend and I am looki ...

Is it possible to conceal dom elements within an ng-template?

Utilizing ng-bootstrap, I am creating a Popover with HTML and bindings. However, the ng-template keeps getting recreated every time I click the button, causing a delay in the initialization of my component. Is there a way to hide the ng-template instead? ...

Removing an attachment from the attachment object array nestled within a comment object array nested inside another object array

I am currently grappling with the challenge of removing an attachment from an array of attachments within a nested structure of comment objects. Despite several attempts, I have yet to find a solution that works effectively. export class CommentSection{ ...