信号及其输入很棒。我很好奇是否有一种好方法可以使用
ngChanges()
、rxjs-observables
甚至新的 effect()
之外的输入更改。
有没有一种方法可以在没有这三个的情况下对输入变化做出反应?
假设我们有一个组件“member”,它有一个输入“id”。每当“id”发生变化时,我想从“MemberService”重新加载数据。
与
ngChanges()
我会这样做:
@Input
id: number | undefined
ngOnChanges(changes: SimpleChanges) {
if(changes.id) {
this.memberSrv.load(this.id()).then((data: any) => this.data = data));
}
}
新的
signals
像这样:
id = input.required<number>();
constructor() {
effect(async ()=>
this.data = await this.memberSrv.load(this.id())
);
}
信号方法的缺陷是 this.id() 乍一看不可见。它在effect方法的某个地方。
我们还可以使用“asObservable”将信号包装在 rxjs-Observables 中,但随后我们依赖于 rxjs 并且信号仍然包装/“隐藏”在函数中:
asObservable(this.id)
有没有什么方法可以在不使用effect()或rxjs的情况下订阅输入?
对输入做出反应的最佳实践是什么?
您可以使用
computed
,它与 effect
相同,并将为您提供数据列表作为信号。
但不确定你的意思
信号方法的缺陷是 this.id() 乍一看不可见。它在effect方法的某个地方。
id = input.required<number>();
data = computed(async () => {
return await this.memberSrv.load(this.id());
});
或者你可以尝试一下。
data = computed(() => {
return toSignal(this.memberSrv.load(this.id()));
});