You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:57:23