使用 subject 在组件之间共享数据时获取未定义

Get undefined when using subject to share data between components

我正在尝试将数据从一个组件发送到另一个组件,但它总是给我 undefined !

这是我的 services.ts :

import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';

 @Injectable({
   providedIn: 'root'
 })
export class DataService {

 constructor() { }

private subjectDossierNumber = new Subject<any>();

sendDossierNumber( dossierNumber : string){
  this.subjectDossierNumber.next(dossierNumber);
}

getDossierNumber() : Observable<any>{
 return this.subjectDossierNumber.asObservable();
}
}

这是发送数据的组件:

 dossierNumber:string;
 constructor(private dataService : DataService){}
 ngOnInit(){
   this.dossierNumber="2145"}
  createNewRequest() { this.dataService.sendDossierNumber(this.dossierNumber); }

这是接收数据的组件:

dossierNumber : string;
constructor(private dataService : DataService){}
ngOnInit() { 
  this.dataService.getDossierNumber().subscribe(data => {this.dossierNumber = data;})
  }

在 sendDossierNumber() 方法中运行良好,但在 getDossierNumber() 方法中数据始终未定义。谁能知道问题出在哪里?

尝试使用private subjectDossierNumber = new BehaviorSubject<string>('')。如果您希望主题包含多个值,请考虑 ReplaySubject

我的第一个猜测是您使用的是 Subject,而不是 BehaviorSubject。主要区别在于 Subject 不是 return 开始订阅时的初始值,而是 BehaviorSubject 是。

有主题

  • 如果您开始订阅,然后发送新消息,将会收到该消息。
  • 如果您发送一条消息,然后开始订阅,您将无法获得 Subject 的当前状态(值)。

有行为对象

  • 如果您开始订阅,然后发送新消息,将会收到该消息。
  • 如果您发送一条消息,然后开始订阅,您将获得 BehaviorSubject 的当前状态(值)。

这里有一些有用的问题供进一步阅读: