【发布时间】:2019-01-31 21:20:21
【问题描述】:
我正在使用 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。这是怎么回事?
【问题讨论】:
-
对于第二个
console.log语句,请尝试:console.log(archive.toString())或console.log(JSON.stringify(archive))。你可能会看到数组是空的。 -
不知道为什么在你已经拥有
private archives = new BehaviorSubject<MyArchive[]>([]);的情况下重复创建public archives$: Observable<MyArchive[]> = this.archives.asObservable(); -
你确定
filteredArchive不为空吗? -
@ConnorsFan 我试过了,是的,数组是空的。这意味着当我执行 console.log(archive) 时,我正在打印对象的实时值。那是什么错误?我的意思是,当我确定调用了 subscribe 方法时,我也尝试在订阅后更新 observable。
-
@SiddharthAjmera 我这样做是一种模式。 observable 应该只可读,因此我将其声明为 public,而不是 BehaviourSubject 是可写的,因此它是私有的,并且只有它的类才能更新它。我遵循了这个官方 Angular 指南:blog.angular-university.io/angular-material-data-table
标签: javascript angular typescript rxjs observable