简体   繁体   English

Angular 2无法订阅共享服务

[英]Angular 2 fail to subscribe with shared service

I have some issues with BehaviorSubject. 我的BehaviorSubject存在一些问题。 Here's shared service for three components: 这是三个组件的共享服务:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

@Injectable()
export class StageEndService {

  private stageNumber = new BehaviorSubject<number>(0);
  private stageNumberPassed = new BehaviorSubject<number>(0);

  stageNumber$ = this.stageNumber.asObservable();
  stageNumberPassed$ = this.stageNumber.asObservable();

  announceStageNumber(num) {
    this.stageNumber.last(num);
  }

  announceStageNumberPassed(num) {
    this.stageNumberPassed.last(num);

  }
}

Here's first part of one of the two components that changes values in service: 这是更改服务值的两个组件之一的第一部分:

import { StageEndService } from './../../../common/services/stage-end.service';

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

...
private value = 6;

constructor (private stageEndService: StageEndService) {

  this.stageEndService.announceStageNumber(value);

}

Second component is similar, but changes value of stageNumberPassed. 第二个组件相似,但是更改stageNumberPassed的值。

In my last component I'm trying to subscribe but fail (console.log returns 0): 在最后一个组件中,我尝试订阅但失败(console.log返回0):

import { StageEndService } from './../../../common/services/stage-end.service';

// there's no provider here since it's not necessary if I'm correct

 constructor(private stageEndService: StageEndService) {}

ngOnInit() {
  this.stageNumberSubscription = this.recruitmentEndService.stageNumber$.subscribe(response => {
  this.stageNumber = response;
});

No idea where's the problem. 不知道问题出在哪里。 When I log values passed to function in service it returns correct numbers. 当我记录传递给服务中函数的值时,它将返回正确的数字。 Don't know if that matters but just in case: last component (where I'm trying to subscribe) is grand-grandchildren of the first component where I'm setting new value for the first time. 不知道这是否重要,但以防万一:最后一个组件(我要订阅的组件)是第一个组件的孙子,在此我第一次设置新值。

Don't add the service to providers of each component. 不要将服务添加到每个组件的提供者。 This way each component gets its own instance and you can't use it to communicate between services. 这样,每个组件都有自己的实例,您不能使用它在服务之间进行通信。

Only provide the service once in the AppModule or a shared parent component. 仅在AppModule或共享父组件中提供一次服务。

this.recruitmentEndService.stageNumber$.subscribe(response => {
  this.stageNumber = response;
});

should be 应该

this.stageEndService.stageNumber$.subscribe(response => {
  this.stageNumber = response;
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM