Luis Crespo Luis Crespo - 3 months ago 48
Javascript Question

Angular 2: sharing data across different routes

I have searched for similar questions in SO and I have not found any that addresses my specific case. There are many techniques to share data between angular components, and I have read this article about component communication: https://angular.io/docs/ts/latest/cookbook/component-communication.html

However none of the techniques described there work for me, because my components are on different routes. The article describes mostly parent-child component communication, and some cases may work for sibling components as long as they are both loaded at the same time.

My case is very similar to the Angular 2 Heroes tutorial: I have a route that displays a table with a list of customers (instead of heroes). When the user clicks on a specific customer, I trigger a route change to display a form with the data for the selected customer (instead of hero).

The heroes tutorial performs a service invocation to retrieve the selected hero data, but I want to avoid a useless additional AJAX call, given that those data are already in memory. I just want to pass the selected customer data to the customer form component so it is immediately displayed.

I am thinking of a "global session" service where I could store and retrieve any object I want, but I am not sure this is a good idea. Are there other more adequate approaches?

Answer

use service that is provided by main application file and then inject it whenever you want to get/set data that will be available in whole app

main.app.ts

@Component({
...
  providers:[yourDataService]
...
})

other components

import {yourDataService} from '...';

@Component({
...
providers:[]// we must use provider from main file
...
})
export class someComponent{

  contructor(private myData:yourDataService){}

}

it is important to use provider from main app file because if you provide service in each component you will have another instances of your service and of course different data in each service

you can also use observables to be notified when some data has changed

for more info look at hierarchical injections or tree injector