如何在NgRx SignalStore中创建带参数的Selector(类NGXS createSelector)
在NgRx SignalStore中实现带参数的响应式Selector
你可以通过withMethods扩展SignalStore,封装带参数的响应式方法,直接返回computed类型的Signal,实现和NGXS中带参数Selector相同的效果。
修改后的SignalStore实现
interface Permission { name: string; } export type UserStoreModel = { permissions: Permission[]; }; const DEFAULT_STATE: UserStoreModel = { permissions: [], }; export const UserStore = signalStore( withState(DEFAULT_STATE), // 使用withMethods添加带参数的响应式方法 withMethods((store) => ({ // 对应NGXS的permission方法,返回匹配权限的Signal getPermission: (permissionName: string) => computed(() => store.permissions().find(p => p.name === permissionName)), // 自定义的权限判断方法,返回布尔值的Signal hasAccess: (permissionName: string) => computed(() => store.permissions().some(p => p.name === permissionName)) })) );
关键说明
withMethods是SignalStore提供的扩展API,用于给Store添加自定义行为,方法内部可以直接访问Store的所有信号(如store.permissions)- 方法内部创建的
computed会自动追踪store.permissions的变化,当权限列表更新时,所有依赖该Signal的地方都会自动刷新 - 这种实现完全遵循Signal的响应式机制,和NGXS中带参数Selector的响应式逻辑一致
视图层使用示例
@Component({ selector: 'app-my-component', template: ` <p *ngIf="hasMyPermission()">拥有MyPermission权限</p> <p>当前匹配的权限:{{ matchedPermission()?.name }}</p> ` }) export class MyComponent { private readonly userStore = inject(UserStore); // 直接获取权限判断的Signal hasMyPermission = this.userStore.hasAccess('MyPermission'); // 获取匹配权限对象的Signal matchedPermission = this.userStore.getPermission('MyPermission'); // 在computed中组合多个权限判断 hasCombinedAccess = computed(() => { return this.hasMyPermission() && this.userStore.hasAccess('AnotherPermission')(); }); }
内容的提问来源于stack exchange,提问作者striker
相关产品推荐
相关产品推荐

