javascript - 订阅后的Angular 2数组有元素但长度为0
问题描述
我正在使用 Angular 2,但我注意到了一个意想不到的行为。
我有一个数据源类,它扩展了 DataSource,有两个变量:
private archives = new BehaviorSubject<MyArchive[]>([]);
public archives$: Observable<MyArchive[]> = this.archives.asObservable();
private filteredArchive: MyArchive[];
我在课堂上以这种方式更新档案:
this.archives.next(this.filteredArchive);
在另一个班级外面,我尝试订阅 observable 但它不起作用:
ngAfterViewInit(): void {
this.dataSource.archives$.subscribe((archive: Array<MyArchive>) => {
console.log(archive.length);
console.log(archive);
console.log(archive.length);
}
}
在控制台日志中打印:
0
<THE ARCHIVE WITH AN OBJECT INSIDE AS IT SHOULD BE, WITH LENGTH = 1>
0
这样我就无法迭代存档变量,因为它的长度为 0。这是怎么回事?
解决方案
在您订阅之前,该值已经发出的问题。想想像电视流这样的可观察对象,如果你在节目结束后打开电视(推送数据后订阅),你的数据就像这个流上的节目,你永远看不到节目。如果您希望您的 observable 保留最后一个值,您可以使用 Scan 运算符,如下所示:
export const reducer = () =>
scan<MyArchive[]>((archive, update) => {
//update your Archive or simply overwrite the value
archive = update
return archive
}, []);
export class datasource {
archives$ : Observable<MyArchive[]>;
archives : Subject<MyArchive[]> = new Subject([]);
update(newMyArchive: MyArchive[]) {
this.archives.next(newMyArchive);
}
constructor(public http: HttpClient) {
this.archives$ = this.archives.pipe(
reducer(),
//use the shareReplay so all your subscribers get the same values
shareReplay(1)
);
this.archives$.subscribe();
}
您可以使用数据源类中的更新方法更新 Arcjive,例如:
this.update(filteredArchive)
推荐阅读
- entity-framework - 实体框架:在哪里查找
- python - 当我在 Django Admin 中删除或添加对象时,它不会在网页上删除或添加?
- python-3.x - 连接到设备并使用 paramiko 打开 shell
- xml - WCF XML 序列化消息格式
- android - FCM BigQuery - 未返回 MESSAGE_DELIVERED 记录
- javascript - Firebase 安全规则不显示任何数据
- jquery - 使用 jQuery 检测输入值变化的更智能方法
- xamarin - 如何为 Xamarin Forms 中的 CollectionView 项目位置设置动画
- python - 找不到 tensorflow 版本
- node.js - 使用 React Native 为 OAuth 获取 Google 和 Facebook 访问令牌的最佳方式是什么?