首页 > 解决方案 > 订阅后的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。这是怎么回事?

标签: javascriptangulartypescriptrxjsobservable

解决方案


在您订阅之前,该值已经发出的问题。想想像电视流这样的可观察对象,如果你在节目结束后打开电视(推送数据后订阅),你的数据就像这个流上的节目,你永远看不到节目。如果您希望您的 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)

推荐阅读