1

I want to share data between component using service. But It not working as expected.

Component

let myNum = 1;
sendChanges(myNum) {
    this.breadService.sendData$.next(myNum);
}

Service

public sendData$: Subject<any> = new Subject();
public setValue$: BehaviorSubject<any> = new BehaviorSubject(this.data);

Sibling COmponent

ngOnInit() {
    this.breadService.sendData$.subscribe(() => {
        this.breadService.setValue$.subscribe(data=>{
            this.id = data
            console.log(this.id);
        });
    });
}

2 Answers 2

7

Here sendData$ is a Subject. Subscription callbacks to a Subject aren't executed till it emits a new value. So the inner subscription wouldn't be executed till a new value is pushed to sendData$ after it is subscribed to. You could change the outer observable too to a BehaviorSubject to assign the value in the subscription immediately.

Service

private sendDataSource: BehaviorSubject<any> = new BehaviorSubject(null);
private setValueSource: BehaviorSubject<any> = new BehaviorSubject(this.data);

public set sendData(data) {
  this.sendDataSource.next(data);
}

public set setValue(value) {
  this.setValueSource.next(value);
}

public get sendData() {
  return this.sendDataSource.asObservable();
}

public get setValue() {
  return this.setValueSource.asObservable();
}

Also a subscription within a subscription isn't elegant. Pipe the outer observable.

Sibling Component

import { pipe } from 'rxjs';
import { switchMap } from 'rxjs/operators';

ngOnInit() {
  this.breadService.sendData.pipe(switchMap(() => this.breadService.setValue))
    .subscribe(data => {
      this.id = data
      console.log(this.id);
    });
}
Sign up to request clarification or add additional context in comments.

6 Comments

Thanks for your answer.. but I got error on next this.breadService.sendData.next(myNum);
Property 'next' does not exist on type 'Observable<any>'
My bad. I forgot to add the setters. I've updated the answer.
You need to set the value using the statement this.breadService.sendData = myNum;. It is updated using the Typescript accessors.
it is problem because of the position file service?
|
5

Seems like you have redundant variable and subscription

Component

let myNum = 1;
sendChanges(myNum) {
    this.breadService.data$.next(myNum);
}

Service

public data$: BehaviorSubject<any> = new BehaviorSubject(this.data);

Sibling component

ngOnInit() {
    this.breadService.data$.subscribe((data) => {
        this.id = data
        console.log(this.id);
    });
}

1 Comment

Make sure that you have provided the same instance of breadService for both components

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.