angular - 使用 RXJS 将项目添加到可观察数组后如何触发可观察值发射?
问题描述
我的服务中有一个可观察的数组:
gearItems$: Observable<GearItem[]>;
该数组在构造函数中被实例化以进行测试:
constructor()
{
this.gearItems$ = of([
{ ID: 1, name: 'T-shirt', price: 10, sizes: [
{ size: Size.L, available: false , color: 'warn' }, ,
], inStock: true, images: [
{ ID: "1", name: "image1", size: 12, type: "type", url: "../../../assets/IMG_5585.JPG" },
{ ID: "123", name: "image2", size: 12, type: "type", url: "../../../assets/IMG_5904.JPG" }
]...)
}
我需要更新/添加该数组中的单个项目并触发新值发射:
updateGearItem(gearItem: GearItem): Observable<GearItem>{
return this.gearItems$.pipe(
flatMap((gearItems: GearItem[]) => {
return gearItems.filter(gI => gI.ID !== gearItem.ID);
})
)
}
createGearItem(gearItem: GearItem): Observable<any>{
// create HTTP request to the backend to create a new item
return this.gearItems$.pipe(
map(gearItems => {
gearItems.push(gearItem)
return gearItems;
})
)
}
但是我不能这样做。在我的 ngOnInit 组件中,我有一个订阅监听gearItems$: Observable<GearItem[]>;
可观察数组:
ngOnInit() {
this.merchandiseService.fetchAllGearItems().subscribe(
(gearItems: GearItem[]) => this.gearItems = gearItems
);
}
但是每当我尝试在可观察数组中添加或更新项目时,什么都没有发生。我在这里想念什么?
解决方案
这是一个简单形式的解决方案。
addItem
将获取当前的内容BehaviorSubject
并附加一个新项目作为副作用。请注意,第一个first()
是确保我们只从 BehaviorSubject 中获取最新值,否则它将继续发出,因为在 .next 后面有一个 .next tap()
。最后的 first() 是完成 observable
const items = new BehaviorSubject([])
const addItem =
(item) => items.pipe(
first(),
tap(arr => items.next([...arr, item])),
first(),
)
items.subscribe(console.log)
addItem('a').subscribe()
addItem('b').subscribe()
addItem('c').subscribe()
推荐阅读
- httprequest - wemos d1 mini 上的 micropython http 请求
- sqlite - SQLITE 声明 - 日期
- java - 使用 App Engine 和 Maven 生成 pom.xml 文件
- r - 为什么特征函数返回“要替换的项目数不是替换长度的倍数”?
- c++ - 使用源向量作为目标
- javascript - Node.js 存储要在多个模块之间使用的变量的最佳方式
- javascript - 无法读取未定义的属性“0” - 日期
- elixir - 在 Elixir 地图中 => 和 : 有什么区别?
- node.js - 使用 axios 处理我的 JSON 数据时遇到问题
- python - Python:从 .seg 文件中提取数据