【问题标题】:Get undefined when using subject to share data between components使用主题在组件之间共享数据时获取未定义
【发布时间】:2021-02-08 12:13:42
【问题描述】:

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

这是我的 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() 方法中数据始终未定义。请问有大神知道是什么问题吗?

【问题讨论】:

    标签: angular subject


    【解决方案1】:

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

    有一个主题

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

    带有 BehaviorSubject

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2019-08-29
        • 2019-01-22
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 2020-08-31
        相关资源
        最近更新 更多