我想知道是否可以检查observable是否收到任何值。我想要这个没有订阅它,因为我懒得覆盖我当前的代码。问题是我在父组件中创建了observable,然后将其传递给子组件。而且我只需要一件小东西,所以订阅它,似乎没必要......
母体组分:
adverts$: Observable<advert[]>;
ngOnInit() {
this.adverts$ = this.advertService.advertsPerUser();
服务:
advertsPerUser() {
return this.advertsKeysPerUser()
.map(adKeys => adKeys.map(adKey => this.afDb.object('adverts/' + adKey.$key )))
.flatMap(val => Observable.combineLatest(val) );
}
所以我的目标是在parent-component.html中执行以下操作:
<div *ngIf="adverts$">
答案 0 :(得分:5)
简而言之,没有。
默认情况下,Observable的行为与函数类似,因此一旦实际订阅,就会向observer发出值。重要的是类似于功能,订阅是实际尝试启动那些可观察的。如果您认为典型函数返回一个值(或不返回),则在函数实际执行并返回其结果之前,您将无法知道。同样适用于Observable,在订阅之前你不能拥有源的值。
答案 1 :(得分:1)
您可以尝试使用defaultIfEmpty运算符(请参见description)。假设您的advertsPerUser返回一个数字,您可以执行以下操作:
this.adverts$ = this.advertService.advertsPerUser().map(count => count > 0).defaultIfEmpty(false);
在html中:
<div *ngIf="adverts$ | async">
或使用rxjs版本6:
this.adverts$ = this.advertService.advertsPerUser().pipe(
map(count => count > 0),
defaultIfEmpty(false)
);
答案 2 :(得分:1)
我有一个类似的问题,我想检查我的响应(自定义类型的数组)是否为空。这是我的解决方案
<div *ngIf="(response$ | async).length == 0">
<p>no results</p>
</div>
答案 3 :(得分:0)
如果可观察的源为空,则可以使用defaultIfEmpty
运算符定义一些默认值。
答案 4 :(得分:0)
使用@Deitsch 我刚刚做了一个更改以避免打字稿错误:
<div *ngIf="(response$ | async)?.length == 0">
<p>no results</p>
</div>
我在 ?
属性前添加了符号:lenght