带有参数的自定义Select() 更新
从@ngxsv3.1开始,他们最终将参数引入@Selector() 文档中的示例 首先,定义@Selector“pandas” user.state.ts带有参数的自定义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
@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>