【发布时间】:2021-03-10 23:08:30
【问题描述】:
免责声明:这与this问题密切相关。
目前我有两个组件,Parent 和 Child。
Parent 将 Observable 传递给 Child,Child 在模板中订阅此 Observable 以避免生命周期/内存泄漏问题。但是我必须在Child 组件中pipe Observable 来设置一些东西。
父.ts:
public $obs = Observable<any>;
....
loadData() {
this.obs$ = this.myService.getData();
}
父.html:
<child [data$]="obs$"></child>
child.ts:
@Input() data$ : Observable<any>;
ngOnChanges(changes) {
if(changes.data$) {
console.log("changes detected");
this.data$.pipe(tap(data => console.log("tap worked")));
}
}
child.html
<div *ngIf="data$ | async as data;">
{{ data || json }}
</div>
数据存在于模板中,控制台日志显示已检测到更改,但从未显示“点击工作”,这让我怀疑我对pipe 的调用可能为时已晚。
在模板“调用”订阅之前有什么方法可以管道?
这个想法是有许多类似于 child 的组件,都在数据对象上做不同的事情。我想过订阅Parent 中的服务并将json 值直接传递给所有孩子,但这需要我在所有孩子中写一个*ngIf。
【问题讨论】:
-
这听起来令人困惑,但你可以编写一个
pipeAngular 管道,它以 rxjspipe()(来自 rxjs 入口点的静态管道)作为其参数,并且与异步管道类似处理输入 observable 何时发生变化。然后像data$ | pipe: yourPipes | async和yourPipes = pipe(tap(...))一样使用它 -
至于你当前的尝试,操作符总是返回一个新的 observable,它们不会改变原来的 observable。此外,我实际上并不推荐我上面的方法,但它应该有效。我可能不希望将 observables 作为输入传递,因为这通常需要子组件中的假设,例如关于它被重放。
-
会不会是您声明了一个名为
$obs的变量,并将this.myService.getData()的输出分配给this.obs$?还是只是帖子中的错字? -
@R.Richards 不,这不是错字,这就是我正在做的。有错吗?
-
@IngoBürk 感谢您的建议。这听起来……有点过于复杂了。现在我将
plain数据传递给孩子们。
标签: angular rxjs observable