0

I have checked various question which involves passing data between parent/child and also between same level components through few other ways including shared service. I am trying to follow the Shared Service pattern to share the data. My simple Shared Service is as follow,

import {Component, Injectable} from '@angular/core'
import * as models from '../_models/models';

import { Subject }    from 'rxjs/Subject';


@Injectable()
export class SharedService {
    // Observable
  private detailSource = new Subject<models.Detail>();

  // Observable number streams
  detail$ = this.detailSource.asObservable();

  // Service commands
  setDetail(value: models.TaskInstance) {
     this.detailSource.next(value);
  }
}

In my Login component, I am calling an API for Login which returns an object,

login() {
    var task = this.api.getDetail().subscribe(
                (data) => this._detail = data,
                error =>{
                    console.log(error);
                },
                () => {
                    console.log("Detail retrieved successfully !");
                    this.sharedService.setDetail(this._detail);
                    this.router.navigate(['dashboard']); 
                }
    );
}

In the above login function inside my Login component, I am calling setTask from sharedService and setting the detail which is retrieved from API.

Now In the Dashboard component, I have the following code,

constructor(private sharedSrvice: SharedService) {
    this.tempVariable = sharedSrvice.detail$.subscribe(
        objDetail => {
            this._detail = objDetail;
        },
        error =>{
            console.log("Error: " + error)
        },
        () => {
            console.log("Shared Service completed !");
        }
    );
}

The issue is that nothing happens inside the constructor of dashboard. I am subscribing to the shared service inside the constructor of the dashboard but the none of the console.log I used are reached which means that this is not working. Maybe I have got this all wrong or doing something not correctly. I am not sure but do I need to use this SharedService in NgModule to be shared between components?

0

1 Answer 1

1

You should create a module that provides this service, it will be used to declare the fact that this service is provided across your module and only across this one.

Example:

@NgModule({
   imports:[...],//Probably HttpModule here, as you are calling an API
   ...
   providers:[SharedService]
})
export class FooModule{}

Then, in your AppModule, import this module

@NgModule({
   imports:[FooModule],
   ...
   providers:[]//Do not provide SharedService here, it's already in your FooModule.
})
export class AppModule{}

This will ensure you have one instance of SharedService in every components of your FooModule.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for your response. Let me try this.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.