如何让Angular计算信号同时响应@Input信号与NGXS惰性选择器?
解决方案
你遇到的问题是因为select()方法本身返回的就是一个Signal,直接在computed()里返回它会得到嵌套的Signal<Signal<Search>>。下面提供两种正确的实现方式:
方法一:使用NGXS的selectSignal结合computed
先确保组件中注入了NGXS的Store:
constructor(private store: Store) {}
然后编写计算信号:
public search = computed(() => { const currentId = this.searchId(); // 根据当前searchId获取对应的选择器信号 const searchSignal = this.store.selectSignal(ActiveDashboardSelectors.searchById(currentId)); // 返回信号的当前值,让computed订阅这个值的变化 return searchSignal(); });
逻辑说明:
- 当
searchId输入信号变化时,computed会重新执行,获取对应id的选择器信号 - 当store中的
searches数据更新时,searchSignal会自动更新,进而触发computed重新计算 - 最终得到的是
Signal<Search | undefined>类型的信号,符合预期
方法二:使用toSignal结合RxJS操作符
利用Angular的toObservable将输入信号转为Observable,再通过switchMap切换到对应选择器的数据流,最后转回Signal:
import { toObservable, toSignal } from '@angular/core/rxjs-interop'; import { switchMap } from 'rxjs'; // 组件内 constructor(private store: Store) {} public search = toSignal( toObservable(this.searchId).pipe( // 每次searchId变化时,切换到对应的选择器数据流 switchMap(id => this.store.select(ActiveDashboardSelectors.searchById(id))) ), // 可选:设置初始值 { initialValue: undefined } );
这个方案适合习惯RxJS操作的场景,同样能同时响应searchId变化和store数据更新。
内容的提问来源于stack exchange,提问作者garethdn
相关产品推荐
相关产品推荐

