Angular 4:如何移除BehaviorSubject默认值?调用next()时能否清除默认值?
关于BehaviorSubject默认值与数组追加的解决方案
嘿,这个问题问到点子上了!先给你理清楚两个核心点:
首先明确:BehaviorSubject的初始默认值是它设计的固有属性,没办法直接“移除”——因为它的核心特性就是会立即向新订阅者发送当前的“最新值”,所以构造时必须传入初始值。不过你的核心需求「调用next()时追加新数组而非覆盖原有数据」,完全可以通过简单逻辑实现,不用纠结“移除默认值”这件事。
具体实现方法
你需要在每次调用next()前,先获取BehaviorSubject当前存储的数组,再把新数组和原数组合并后传入,而不是直接把新数组丢给next()。举个实际的代码例子:
假设你的BehaviorSubject定义是这样的:
private posts = new BehaviorSubject<Array<Object>>([ {'post_body':'Owls are creepy', 'subject':'BlahBlah'} ]);
当你拿到新的帖子数组(比如API请求返回的newPosts),想要追加到现有列表里,可以这么写:
// 先获取当前已存储的所有帖子 const currentPosts = this.posts.value; // 合并原数组与新数组,再调用next更新 this.posts.next([...currentPosts, ...newPosts]);
或者用数组的concat方法,效果完全一致:
this.posts.next(currentPosts.concat(newPosts));
额外小提示
如果你一开始的默认数组其实是多余的(比如初始状态应该是空数组),直接把初始值设为空数组[]就好,既符合BehaviorSubject的要求,也不会有多余的默认数据。
另外,如果你的业务场景不需要订阅者一上来就拿到初始值,也可以考虑用普通的Subject替代——但Subject不会主动发送初始值,只有订阅后才会收到后续的next()更新,这点要根据你的实际需求来选择。
内容的提问来源于stack exchange,提问作者Milan Velebit
相关产品推荐
相关产品推荐

