如何使用 BehaviourSubjects 在 Angular 组件之间共享 API 调用的数据?

2023-11-29

我目前正在构建一个 Angular 应用程序,在其中向 api 发出请求,并将响应映射到两个不同的数组。我可以在我的app.components.ts但我会根据我的需要制作新的组件。如何在组件之间共享数据以确保组件始终拥有最新数据,因为我还需要定期调用 API。

我在 SO 和一些 YouTube 视频上看到了一些答案,但我只是不完全理解它。

我的服务代码是

 url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson'; 
  private _earthquakePropertiesSource = new BehaviorSubject<Array<any>>([]);
  private _earthquakeGeometrySource = new BehaviorSubject<Array<any>>([]);


  constructor(private readonly httpClient: HttpClient) {

  }


  public getEarthquakeData(): Observable<{ properties: [], geometries: []}> {
    return this.httpClient.get<any>(this.url).pipe(
      // this will run when the response comes back
      map((response: any) => {
        return {
          properties: response.features.map(x => x.properties),
          geometries: response.features.map(x => x.geometry)
        };
      })
    );
  }

它正在我的中使用app.component.ts如下:

 properties: Array<any>;
 geometries: Array<any>;

constructor(private readonly earthquakeService: EarthquakeService) {
  }

  ngOnInit() {
    this.earthquakeService.getEarthquakeData().subscribe(data => {
      this.properties = data.properties;
      this.geometries = data.geometries;
      this.generateMapData();
    });
  }

  generateMapData() {
    for (const g of this.geometries) {
      const tempData: any = {
        latitude: g.coordinates[0],
        longitude: g.coordinates[1],
        draggable: false,
      };
      this.mapData.push(tempData);
    }

任何帮助将不胜感激。


这是一个描述如何使用纯 RxJS 完成此操作的答案。另一种选择是使用 NgRx。

首先,您设置了两个主题。目的是让所有组件都订阅它们并在刷新时接收最新数据?

你应该使用ReplaySubject代替BehaviorSubject不过,因为你没有任何初始状态。由于数据作为一件事返回,我会使用一个主题。

首先,我将声明一个接口,以便更容易讨论数据类型。

地震数据.ts

export interface EarthquakeData {
  // TODO: create types for these
  geometries: any[]; 
  properties: any[];
}

在您的服务中,您可以通过自己的方法公开数据来分离检索和通知。

地震服务.ts

  url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson'; 

  private _earthquakeData$ = new ReplaySubject<EarthquakeData>(1);

  constructor(private readonly httpClient: HttpClient) {}

  getEarthquakeData(): Observable<EarthquakeData> {
    // return the subject here
    // subscribers will will notified when the data is refreshed
    return this._earthquakeData$.asObservable(); 
  }

  refreshEarthquakeData(): Observable<void> {
    return this.httpClient.get<any>(this.url).pipe(
      tap(response => {
        // notify all subscribers of new data
        this._earthquakeData$.next({
          geometries: response.features.map(x => x.geometry),
          properties: response.features.map(x => x.properties)
        });
      })
    );
  }

所以现在,所有想要接收数据的组件都将订阅一个方法:

private destroyed$ = new Subject();

ngOnInit()
  this.earthquakeService.getEarthquakeData().pipe(
    // it is now important to unsubscribe from the subject
    takeUntil(this.destroyed$)
  ).subscribe(data => {
    console.log(data); // the latest data
  });
}

ngOnDestroy() {
  this.destroyed$.next();
  this.destroyed$.complete();
}

您可以在任意位置刷新数据:

refreshData() {
  this.refreshing = true;
  this.earthquakeService.refreshEarthquakeData().subscribe(() => {
    this.refreshing = false;
  });
}

DEMO: https://stackblitz.com/edit/angular-uv7j33

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 BehaviourSubjects 在 Angular 组件之间共享 API 调用的数据? 的相关文章

随机推荐

  • 如何快速检查字符串中是否有正确的英文单词? - Python

    我在 pandas 数据框中有一列 其中每个单元格都包含一串相当长的单词 这些字符串来自 SQL 数据库 包含非英语的单词和字母数字 ID 短语的混合 并以空格分隔 这些字符串最多可达 SQL 的最大字符数 这也不是一个小数据框 我有几百万
  • 从 firebase 中删除项目而不会使应用程序崩溃

    我是 android 新手 我一直在玩this来自 firebase 的示例应用程序 我想添加一个删除按钮发布详细活动它通过将 DatabaseReference mPostReference 设置为 null 来从数据库中删除当前正在查看
  • 无法使用 cordova-plugin-statusbar 设置状态栏的颜色

    我正在尝试更改离子应用程序中本机状态栏的颜色 但无法使其工作 我已经安装了 cordova plugin statusbar 并且安装得很好 下面的代码可以完美运行 if StatusBar StatusBar hide 但尝试使用任何其他
  • IE8后退按钮和动态内容

    我有一个页面 它提取外部 JavaScript 文件 然后该文件动态生成一些内容到该页面中 基本上插入一些 DIV 和 Flash 对象 当用户离开此页面然后按 后退 按钮时 Safari 和 Firefox 会显示生成的内容 但 IE 8
  • javaFX Tableview 数据不可见

    我尝试了所有方法来用数据填充 TableView 下一个代码在表中插入新行 但数据未出现在表中 我试图为此找到一个解释 但没有成功 请帮忙 我不知道出了什么问题 在控制器 java中 FXML private TableView
  • 如何使 llvm jit 在 MSVC++ 中工作

    看来 LLVM 中的 Kaleidoscopy 示例已经被破坏了 至少在 MSVC x64 中已经被破坏了一段时间 也许几个月 出于同样的原因 它在 MCJIT 和新的 Orc JIT 框架中不起作用 Get the address of
  • 根据关联模型的总和对玩家进行排序

    我有一个6500的数据库players每个玩家平均有15场比赛results Use case 我想生成一个玩家列表 按以下顺序排序sum他们的prize金钱 结果表中的一个字段 我更喜欢它在某种范围内 所以我还可以过滤玩家所在国家 地区的
  • 链接 PHP PDO 查询

    我不确定 链接 是否是正确的术语 但我要问的是是否可以进行类似于此 MySQLi 查询的 PDO 查询 sql mysqli fetch object db gt query SELECT username FROM member WHER
  • 由于 JavaScript 中不保证对象中的属性顺序,JSON.stringify() 的实际行为如何?

    Since JavaScript 中不保证对象中的属性顺序 如何JSON stringify 实际上表现如何 以下内容总是正确的 同一对象 吗 const o a 1 b 2 console log JSON stringify o JSO
  • ESRI:无法解析源映射

    我在 Google Chrome 开发者控制台中收到此错误 无法解析 SourceMap http localhost 15132 Scripts External igniteui css themes infragistics infr
  • https url 中的用户名和密码

    考虑一下网址 https foo 电子邮件受保护 上例中的用户名 密码部分是否符合 URL 参数 的条件 如中所定义这个问题 当您将用户名和密码放在主机前面时 该数据不会以这种方式发送到服务器 相反 它会根据所使用的身份验证模式转换为请求标
  • 如何用 SPS 和 PPS 数据填充 AVCodecContext 的“extradata”字段?

    问题是这样的 当解码 H264 流时ffmpeg 我可以获得SPS和PPS的原始数据 但我不知道如何将它们填充到extradata现场AVCodecContext 没有extradata 我无法正确解码帧 每次我打电话avcodec dec
  • 解析lxml中的html正文片段

    我正在尝试解析 html 片段 h1 title h1 img src I use lxml html fromstring 这让我发疯 因为它不断剥夺我的片段的标签 gt lxml html fromstring h1 a h1 tag
  • 读取RIP寄存器给出下一条指令的地址? [复制]

    这个问题在这里已经有答案了 我尝试读取x86 64寄存器的值rip 这是什么objdump shows 4017ec 48 8d 35 00 00 00 00 lea 0x0 rip rsi 4017f3 41 89 d4 mov edx
  • 从“mapend”函数到“Monoid”实例的函数?

    我有一个数据结构 它是玫瑰树的一个特定子类 形成具有最大下界和最低上界函数的格 并且它支持两个完全合理的函数作为Monoid班级的mappend 有什么办法支持匿名吗MonoidHaskell 中的实例 这是我应该考虑使用 Template
  • 无法识别的选择器发送到 NSKeyedUnarchiver 实例

    无法弄清楚为什么会不断抛出此错误 NSCFString bytes unrecognized selector sent to instance 0xc3eb200 对于这段代码 void parser SBJsonStreamParser
  • 从 Excel 运行 SQL Server 过程

    我正在使用 SQL Server 2008 Enterprise 我在一个数据库中创建了一个过程 该过程由对不同数据库的多个查询组成 并显示最终的组合结果集 我尝试通过 Excel 执行它 因此结果将自动显示在 Excel 工作表中 但我收
  • ARKit模板Xcode项目主线程检查器日志控制台

    我刚刚启动了一个新的 Xcode ARKit 项目并在物理设备上运行它 但在控制台中我得到以下输出 Main Thread Checker UI API called on a background thread UIApplication
  • 在 Microsoft 依赖注入中获取开放式通用服务

    假设我们有以下服务 interface IService interface IService
  • 如何使用 BehaviourSubjects 在 Angular 组件之间共享 API 调用的数据?

    我目前正在构建一个 Angular 应用程序 在其中向 api 发出请求 并将响应映射到两个不同的数组 我可以在我的app components ts但我会根据我的需要制作新的组件 如何在组件之间共享数据以确保组件始终拥有最新数据 因为我还