Angular 无法订阅主题数据

Angular 无法订阅主题数据,angular,angular6,angular7,Angular,Angular6,Angular7,我正在使用共享服务使用Subject发送数据。在一个组件中,我试图订阅主题数据,但它从未订阅 我通过组件A中的主题发送索引数据,如下所示 A部分 export class ComponentA { onEditTestCase(index: number){ this.sharedService.startedEditing.next(index); } } 我正在使用一个共享服务来使用Subject发出索引数据。 共享服务 import { Subject } from 'r

我正在使用共享服务使用Subject发送数据。在一个组件中,我试图订阅主题数据,但它从未订阅

我通过组件A中的主题发送索引数据,如下所示 A部分

export class ComponentA {
  onEditTestCase(index: number){
    this.sharedService.startedEditing.next(index);
  }
}
我正在使用一个共享服务来使用Subject发出索引数据。 共享服务

import { Subject } from 'rxjs/Subject';

export class SharedService {

constructor(private sharedService: SharedService, private router: Router) {}

  startedEditing = new Subject<number>();
}

我在上面的代码中是否做错了什么?

将主题更改为私有属性,并使用属性getter将主题作为可观察对象返回。 还要确保您使用的是相同的服务实例,将其定义为模块级的提供者或父组件内部的一级提供者

import { Subject } from 'rxjs/Subject';
export class SharedService {
private startedEditing = new Subject<number>();

public get StartEditing(): Observable<number> {
return this.startedEditing.asObservable();
}
从'rxjs/Subject'导入{Subject};
导出类共享服务{
private startedEditing=新主题();
public get StartEditing():可观察{
返回此.startedEditing.asObservable();
}

尝试使用
ReplaySubject
而不是
Subject

尝试实现下面的代码

common.setvice.ts

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

@Injectable({
  providedIn: 'root'
})

export class CommonService {

  private startedEditing = new ReplaySubject<any>();
  public startedEditing$ = this.startedEditing.asObservable();
  constructor() { }

  setData(data) {
    this.startedEditing.next(data);
  }

}
b、 组件技术

import { Component } from '@angular/core';
import { CommonService } from './common.service'

@Component({ templateUrl: 'b.component.html' })
export class BComponent {
    constructor( 
        private commonService: CommonService
     ) { }

    ngOnInit() {
        this.commonService.startedEditing$.subscribe(data => {
            console.log(data); // this will print "data from component A";
        });
    }
}

如果上面的代码不清楚,请告诉我。

可能的重复项您是否在两个组件中使用相同的sharedService实例?服务是否为单例?您如何在组件a和组件B中创建服务实例?您向我们展示的服务没有@Injectable注释,并且您没有向我们展示组件的构造函数。我有e添加了构造函数代码。返回一个主题和一个可观察的有什么区别?没有逻辑上的区别。它更干净,因为你阻止组件调用next()。我不理解公共服务代码。我的代码中的“data”和“startedEditing”相同吗?@raghul selvayes!我用“startedEditing”更新了代码variableI使用了与您提到的相同的代码。在不发送数据的情况下,我尝试加载组件并获取订阅。当我发送一些数据时,它必须订阅。这是因为BehaviorSubject需要初始值才能启动,这就是为什么我们在声明时传递“null”,我已使用“ReplaySubject”更新了代码,这不需要主动性,现在检查并让我知道参考:我使用了ReplaySubject,setData方法在CommonService中被调用,但在组件B中它没有被订阅。使用行为主题它被订阅了,但它有一个初始值。现在不确定出了什么问题
import { Component } from '@angular/core';
import { CommonService } from './common.service'

@Component({ templateUrl: 'a.component.html' })
export class AComponent {
    constructor( 
        private commonService: CommonService
     ) { }

    ngOnInit() {
        this.commonService.setData('data from component A');
    }
}
import { Component } from '@angular/core';
import { CommonService } from './common.service'

@Component({ templateUrl: 'b.component.html' })
export class BComponent {
    constructor( 
        private commonService: CommonService
     ) { }

    ngOnInit() {
        this.commonService.startedEditing$.subscribe(data => {
            console.log(data); // this will print "data from component A";
        });
    }
}