【问题标题】:Angular BehavioralSubject not working as expectedAngular BehavioralSubject 未按预期工作
【发布时间】:2018-08-24 23:49:58
【问题描述】:

我有一个从 API 中提取数据的服务

import { IStats } from './istats';
export class WebService {
  BASE_URL = 'http://localhost:3000/api';
  public stats = new BehaviorSubject<IStats>({
    date: this.datePipe.transform(new Date(), 'dd-MM-yyyy'),
    answeringMachine:0,
    hangUp:0,
    conversations:0
  });

  constructor(private http: HttpClient, private datePipe: DatePipe) {
    this.getStatsbyDate('04-03-2018');
    // this.getStatsbyDate(this.datePipe.transform(new Date(), 'dd-MM-yyyy'));
  }
  getStatsbyDate(date) {
    this.http.get<IStats>(this.BASE_URL + '/stats/' + date)
      .subscribe((data: IStats) => {
        this.stats.next(data);
      });
  }

然后我有一个组件订阅了服务中的 BehavioralSubject。

export class StatsComponent {
  private stats: IStats;
  constructor(private webService: WebService, private datePipe: DatePipe)     {
    this.stats = this.webService.stats.getValue();
  }

我认为如果后端 API 没有任何数据,那么行为主体会返回默认值,目前该值有效,但是如果后端确实有数据通​​过,那么它不应该替换默认值吗?使用 API 中的值? 我在这里做错了什么吗? 请指教!

【问题讨论】:

  • 如果您能提供一个“最小、完整且可验证的示例”,这将很有帮助 - 请参阅 stackoverflow.com/help/mcve 对于小型 Angular 应用,stackblitz.com 可能非常有用。

标签: angular typescript rxjs5 behaviorsubject


【解决方案1】:

我能够对组件代码进行一些更改

export class StatsComponent {
  private stats: IStats;
  constructor(private webService: WebService, private datePipe: DatePipe) {
    this.webService.stats$.subscribe(data => {
      if (data !== null) { this.stats = data; }  
      else { this.webService.stats$.next(this.stats); }
    })
  }

通过这种方式,如果没有来自 API 的数据,BehavioralSubject 会从服务中提供默认值,反之亦然。

【讨论】:

    猜你喜欢
    • 2020-02-19
    • 2019-04-15
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多