带有参数的自定义Select() 更新

带有参数的自定义Select() 更新,select,ngxs,Select,Ngxs,从@ngxsv3.1开始,他们最终将参数引入@Selector() 文档中的示例 首先,定义@Selector“pandas” user.state.ts @Selector() static getUserLocationSlots(state: UserStateModel, location: any) { console.log(state); console.log(location); // <-- expecting 'new york', but getting

从@ngxsv3.1开始,他们最终将参数引入@Selector()

文档中的示例 首先,定义@Selector“pandas

user.state.ts

@Selector() 
static getUserLocationSlots(state: UserStateModel, location: any) {
  console.log(state);
  console.log(location); // <-- expecting 'new york', but getting undefined
}
@Selector()
静态getUserLocationSlots(状态:UserStateModel,位置:任意){
console.log(状态);

console.log(location);//我认为不可能将参数传递给ngxsv2中的
@Selector()
修饰函数。不过这会很好

有一张这样的票

另外,我认为您没有正确使用@Selector()。我应该是这样的(因此,无法传递参数):

请参阅


注意:我不是ngxs方面的专家……这只是基于我现在的理解。

这在ngxs v2和v3中是可以实现的。复制自我在动态选择器讨论中的评论

目前,我们可以使用经常用于redux的模式来实现这一点 选择器

可以编写
@选择器
装饰器,使其返回函数 使用所需参数。这将启用所需的动态选择器 参数以及选定状态的延迟解析。对于 例如:

@State<UserStateModel>( ... ) 
export class UserState {   
  @Selector()  
  getFilteredUsersFn(userStateModel: UserStateModel) {
    return (filter: string) => 
      userStateModel.users.filter((user) => user.indexOf(filter) >= 0);
  }
} 
@State(…)
导出类UserState{
@选择器()
getFilteredUsersFn(userStateModel:userStateModel){
返回(筛选器:字符串)=>
userStateModel.users.filter((user)=>user.indexOf(filter)>=0);
}
} 
然后该组件将包含:

@Component({...}) 
export class AppComponent {  
  @Select(UserState.getFilteredUsersFn) 
  filteredUsersFn$: Observable<(filter: string) => User[]>;

  get currentFilteredUsers$() {
    return this.filteredUsersFn$
      .pipe(map(filterFn => filterFn('myFilter')));   
  } 
} 
@组件({…})
导出类AppComponent{
@选择(UserState.getFilteredUsersFn)
filteredUsersFn$:可观察用户[]>;
获取currentFilteredUsers$(){
返回此文件。filteredUsersFn$
.pipe(map(filterFn=>filterFn('myFilter'));
} 
} 

要传递参数,您可以让select返回函数,它并不优雅,但可以工作

例如,select语句如下所示:

  @Selector()
  static getItemByIdFn(state: { [id: number]: Entity }) {
    return (id: number) => {
      return state[id];
    };
  }
然后在组件中:

this.store.select(MyState.getItemByIdFn)
  .pipe(map(mapByIdFn) => mayByIdFn(1)) // using the returned function
  .subscribe(...);
请注意映射,在这里您可以将id传递给返回的函数。在这里您可以放置您想要的任何参数


希望这对您有所帮助:)!

您可以通过使用
@ngxs/store
中的
功能来实现这一点

在.state.ts文件中:

static getLocationSlots(location: string) {
    return createSelector([UserState], (state: string[) => {
        // logic for filtering your data
        // eg.: state.filter(element => element == location)
    })
}

In your .component.ts file:

@Select(UserState.getLocationSlots('new york')) slots$: Observable<any>
静态getLocationSlots(位置:字符串){
返回createSelector([UserState],(状态:string[)=>{
//过滤数据的逻辑
//例如:state.filter(元素=>元素==位置)
})
}
在.component.ts文件中:
@选择(UserState.getLocationSlots('new york'))slots$:可观察以了解更多详细信息


坦白地说,有什么帮助吗。谢谢。我要试试下面的
@Select(state=>state.user['location'].slots)user$;
是的,没有用。如果我能把它用到工作中,我会继续查找并发布回复谢谢,马克,给我一个机会。
@Component({...}) 
export class AppComponent {  
  @Select(UserState.getFilteredUsersFn) 
  filteredUsersFn$: Observable<(filter: string) => User[]>;

  get currentFilteredUsers$() {
    return this.filteredUsersFn$
      .pipe(map(filterFn => filterFn('myFilter')));   
  } 
} 
  @Selector()
  static getItemByIdFn(state: { [id: number]: Entity }) {
    return (id: number) => {
      return state[id];
    };
  }
this.store.select(MyState.getItemByIdFn)
  .pipe(map(mapByIdFn) => mayByIdFn(1)) // using the returned function
  .subscribe(...);
static getLocationSlots(location: string) {
    return createSelector([UserState], (state: string[) => {
        // logic for filtering your data
        // eg.: state.filter(element => element == location)
    })
}

In your .component.ts file:

@Select(UserState.getLocationSlots('new york')) slots$: Observable<any>