rxjs - Angular 9 - BehaviorSubject 提供以前的价值
问题描述
我正在尝试为获取数据并将数据分配给组件的通用方式提供解决方案。我正在玩 BehaviorSubject,因为我认为它是该工作的合适人选。这是一些代码:
服务:
public listSubject: BehaviorSubject<any[]>;
constructor(private service: someservice) {
this.listSubject = new BehaviorSubject<any[]>([]);
}
public requestList(id: number) {
this.someservice.get('url')
.subscribe(data => {
this.listSubject.next([data]);
});
}
public get list(): any[] {
if (this.listSubject.value.length > 0) {
return [this.projectListSubject.value];
} else {
return null;
}
}
执行:
constructor(public service: AwaAlertsService) {
// need full list first
this.service.requestProjectList(1);
this.list = this.service.projectList;
}
this.service.requestList(id);
this.list = this.service.list;
除了我得到以前的值外,它可以工作。
知道我在做什么错吗?
谢谢
解决方案
至少在这个例子BehaviorSubject
中是多余的,因为你可以简单地将列表分配给一个类似的属性: Array<any>
,它会做同样的事情而没有rxjs
.
但是,如果您将列表变成可观察的,那么BehaviorSubject
就有意义了,因为现在它会在列表发生更改时发出通知,并且您可以在应用程序之间共享它。
constructor(private service: someservice) {
this.listSubject = new BehaviorSubject<any[] | null>(null);
}
public get list$(): Observable<any[] | null> {
return this.projectListSubject;
}
稍后在组件代码或模板中
this.doSomething = service.list$.pipe(
// ....
);
<ng-container *ngIf="service.list$ | async as items">
<ng-container *ngIf="items">
<div *ngFor="let item of items"> {{ item }} </div>
</ng-container>
</ng-container>
推荐阅读
- angular - 如何使用 Spring Boot + Angular 处理外部 OAuth2 身份验证
- c++ - Std::vector 不改变类内的数据
- sql - 如何在没有关系的情况下使用 Sequelize 加入表
- javascript - pjax : 类似于浏览器后退按钮的 HTML 链接
- python - Python Flask - 如何通过 cookie/会话记住匿名用户?
- api - 使用带有静态 jwt 令牌的 Api 服务器保护应用程序
- python - 如何更改kivy中的按钮大小?
- pdf - Outlook 文件格式
- random - 生成差值始终为正的随机数
- javascript - 提升优先级和可变变异