angular - 在两个活动组件之间共享单个 API 调用的 Angular 最佳实践
问题描述
我试图弄清楚以下情况的最佳做法是什么:
我有两个组件 A 和 B,它们都集成在一个页面上。两个组件都需要访问数据集 C。数据集 C 由服务器的 API 调用接收。它应该只在最初接收,而不是每个组件都接收两次。
我的第一种方法是使用 observables,但随后 API 调用执行了两次。所以我切换到 BehaviourSubjects,但是当从控制器调用时,初始值当然是 null。所以我用ReplySubjects替换了它,它工作正常。但我正在为最初的电话而苦苦挣扎。我让它工作正常,但我正在寻找最佳实践。这是代码:
组件 A 和 B 相似
getDataC(): void {
this.dataCService.getData().subscribe(data=>{this.data = data})
}
我也想在我的服务中拥有数据,所以我可以使用对象对 API 进行更新,以修改服务器上的数据。我的方法运行良好,但我不确定我是否必须在我的服务中订阅这个变量或保持它干净。
然后我的服务:
import { Injectable } from '@angular/core';
import { DataCAPIService } from '../resources/resources.service'
import { Observable, of, BehaviorSubject, ReplaySubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataCService {
public dataC = new ReplaySubject<any>(1)
dataCInsideService: any
constructor(private dataCAPIService: DataCAPIService) {
}
getDataCAPICall() {
if (this.dataC.observers.length < 2)
this.dataCAPIService.getAll({}).subscribe(data => {
this.dataC.next(data);
this.dataC.subscribe(data => this.dataCInsideService = data)
})
}
getData() {
this.getDataCAPICall();
return this.dataC;
}
saveDataC() {
this.dataCAPIService.update(this.dataCInsideService, {}).subscribe(data => {
this.dataC.next(this.dataCInsideService);
})
}
}
感谢您对更好的风格提出任何意见或解决方案。
解决方案
我有两个组件 A 和 B,它们都集成在一个页面上。两个组件都需要访问数据集 C。
只要它们在一页中使用,为什么要从每个组件中调用它们?我认为您可以从页面组件中调用它并将其发送给孩子。
孩子们可以使用@Input()
装饰器获取数据。您可以直接发送数据,也可以将其作为 observable 发送(如果是行为主题或主题就可以)。
我希望这可以帮助你。
推荐阅读
- reactjs - 停止监听更改以存储在 react-redux 中
- javascript - “npm install”不安装任何东西
- javascript - discord.js - 排行榜未定义的用户名
- android - 滚动 RecyclerView 时如何获取更新的滚动位置
- html - 在单选按钮图像上设置悬停图像
- swift - 为什么我在 swift 中得到 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
- c# - 为什么这个脚本统一显示错误?
- azure - 将 Azure blob 容器中的数据读入计算机视觉服务
- java - 第 1 行:语法错误:chromedriver 尝试从 Docker 运行时出现意外单词(期望“)”)
- python - Python 事件集成中的 QML Calendar 和 Google Calendar API