【问题标题】:Observable of a BahaviorSubject not being emitted未发出 BehaviorSubject 的 Observable
【发布时间】:2020-03-19 08:10:53
【问题描述】:

我有一个服务返回数据模型。该模型包含 DateTime 属性 (RelevantDateTime) - 从服务器返回的当前 UTC DateTime。 我想在与执行服务的组件不同的组件中使用这些数据。我正在使用 BahaviorSubject(我使用 Subject 并将其更改为 BahaviorSubject)来执行此操作。它应该很简单,但不知何故我遗漏了一些东西 - 没有发出可观察的东西 - 需要数据的组件 (HeaderComponent) 没有得到它。 查看我的代码:

    export class MyService
    {
        content : any;
        //I've changed the Subject to BahaviorSubject
        timeOfExecutionSubject = new BahaviorSubject<Date>(new Date());
        timeOfExecutionSubjectChanged : Observable<Date> = this.timeOfExecutionSubject.asObservable();

        constructor (private httpClient : HttpClient){}
        getData()
        {
            return this.httpClient.get<myModel>(<httpGetUrl>)
            .pipe
            .tap(
                {
                    res => this.content = res;
                    this.timeOfExecutionSubject.next(content.RelevantDateTime);
                }),
                catchError(error => throwError(error))
                );
        }

        getRelevantDateTime()
        {
            return this.timeOfExecutionSubjectChanged;
        }
    }

这是执行服务的组件:

    export class MainComponent // This component execute the service
    {
        constaructor(private myService : MyService ){}
        ngOnInit()
        {
            let sub = this.myService.getData().
            subscribe (res => 
            {
                this.setData(res);
            })
        }
    }   

这是需要 RelevantDataTime 的组件

    export class HeaderComponent implements OnInit
    {
        executionDateTime : string;
        constructor(private myService: MyService)
        {
            this.myService.getRelevantDateTime().subscribe(
                result => this.executionDateTime = moment(result).format("HH:mm");
            )
        }
    }

【问题讨论】:

  • 那里没有重播行为 - 标头是否在 事件发出后加入?
  • @jonrsharpe - 不,标题是骨架的一部分
  • @jonrsharpe - “你没有重播行为”是什么意思?
  • 我的意思是您没有使用重播/行为主题,因此任何在事件发出后加入的订阅者都不会收到它们。
  • @jonrsharpe - 我已将其更改为行为主题。还是不行

标签: angular rxjs behaviorsubject subject subject-observer


【解决方案1】:

找到了 observable 未发出的根本原因 - 服务应该在最“上层”的模块或包含 2 个相关组件的模块的模块中声明。就我而言 - 我从包含 MainComponent 的模块中删除了 MyService 的声明,并将其删除为在 Header 的模块中声明(导入 mainComponent 模块)。 见参考: https://github.com/angular/angular/issues/11618 -
“为了让两个组件在多个组件之间共享服务,您应该在更高级别提供服务,而不是将服务添加到两个组件的提供者。”

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多