【发布时间】:2018-07-14 00:17:53
【问题描述】:
我有一个可观察的,当我使用 rxjs 'share' 运算符时,Angular 模板中的行为很奇怪。以下是我设置两个可观察对象的方法(在服务中):
this.family = this.store.select(getFamily).pipe(
tap(family => {
if (family == null) {
this.loadFamily();
}
}),
filter(family => family != null),
share(),
);
this.familyMembers = this.family.pipe(
map(family => {
return family.familyMembers;
})
);
然后,我将可观察的 familyMember 作为属性添加到我的组件中
this.familyMembers = this.familyService.familyMembers
我的标记看起来像这样:
<tbody *ngIf="(familyMembers | async) != null">
<pre> {{(familyMembers | async) | json}}</pre>
现在奇怪的是,当familyMembers 被填充(两个数组)时,<pre> 将在内部呈现null,即使我已经使用*ngIf 检查了null。
我还有一个不呈现任何内容的列表,如下所示:
<ng-template ngFor let-familyMember let-i="index" [ngForOf]="(familyMembers | async)" [ngForTrackBy]="trackByFn">
我知道familyMembers observable 发出的最后一件事是正确的两个家庭成员,我已经用map 和console.log 进行了检查。 Angular 模板似乎将其视为 null.. 但也不是?
如果我从可观察的家庭中删除 share() 一切正常,但 tap() 运行两次,这是不可取的。
编辑:
使用 shareReplay() 而不是 share() 解决了我的问题。当所有订阅都取消订阅时,share() 不会重新发出值。
【问题讨论】:
-
尝试 0 | async"> 然后,
{{familyMembers | json}}0"> 导致错误:无法读取 null 的属性“长度”这不是我写的,但再试一次: 然后,{{familyProps | json}},注意我写的内容,不添加你的添加就试试,如果它不起作用,试着找出别的东西您的第二个建议奏效并呈现了预期的结果 - 我不明白为什么使用“as”会对它产生任何影响。我添加了答案,如果对你有帮助,请随时标记,祝你好运!