Angular 2 - 服务订阅主题属性不会捕获事件

时间:2016-10-11 12:39:33

标签: angular rxjs

这是服务:

@Injectable() 
export class AuthService {

  public reset: Subject<any>;

  constructor() {
    this.reset = new Subject();
  }

  public logout() {
   this.reset.next('logout');
  }
}

这是另一项想知道logout()何时发生的服务:

@Injectable()
export class StoreService() {

  constructor(private auth: AuthService) {

    this.auth.changes.subscribe((value) => {
      // Do not work God knows why
    });
  }
}

第二项服务中的订阅永远不会发生任何事件。为什么呢?

3 个答案:

答案 0 :(得分:2)

我发现了问题 - 有多个AuthService实例(谢谢@Martin)。问题是如果有人添加:[AnyService]提供任何组件,将没有错误,但您将获得两个(或更多)服务实例。 通过将console.log(counter++)添加到服务构造函数中,可以轻松找到此类错误。

答案 1 :(得分:1)

@Injectable() 
export class AuthService {

  public reset: Subject<any>;
  reset$ = null;

  constructor() {
    this.reset = new Subject();
    this.reset$ = this.reset.asObservable();
  }

  public logout() {
   this.reset.next('logout');
  }
}

其他消耗它的服务订阅该事件。

@Injectable()
export class StoreService() {

  constructor(private auth: AuthService) {

    this.auth.reset$.subscribe((value) => {
      console.log(value);
      //implement your own logic here
    });
  }
}

答案 2 :(得分:0)

您必须定义可在其他服务或组件中订阅的Observable字符串:

@Injectable() 
export class AuthService {

  public reset: Subject<any>;
  /**
   * Observable string streams
   */
  notifyObservable$ = this.reset.asObservable();


  constructor() {
    this.reset = new Subject();
  }

  public logout() {
   this.reset.next('logout');
  }
}

// StorageService

@Injectable()
export class StoreService() {

  constructor(private auth: AuthService) {

    this.auth.notifyObservable$.subscribe((value) => {
      // Do not work God knows why
    });
  }
}