不要订阅动作 ngxs
Do not subscribe to actions ngxs
我有一个状态选择器和操作如下
@Selector()
public static employees(state: EmployeeSearchStateModel) {
return state.employees;
}
@Action(FetchEmployees)
getEmployees({ getState, setState }: StateContext<EmployeeSearchStateModel>) {
const state = getState();
this.employeeService.getEmployees().pipe(tap((res: EmployeeSearch) => {
setState({
...state,
loading: false,
employees: res.userData
});
}));
}
现在,在一个组件中,我想将它与异步管道一起使用,但它不起作用。组件声明如下:
@Select(ManageEmployeeSearchState.employees) employees$: Observable<EmployeeI[]>;
ngOnInit(){
this.store.dispatch(new FetchEmployees());
}
在 HTML 中,当我尝试打印 <pre>{{ employees$ | async | json }}</pre>
时,它不起作用。我看不到后端 API 被调用。
但是,如果我将 pipe and tap
in Action 替换为 subscribe
,则一切正常。但是我不想订阅?
有线索吗?
如果您在状态中使用 pipe
运算符而不是调用订阅,则需要 return 将 Observable 发送给 NGXS,以便框架为您订阅它:
@Action(FetchEmployees)
getEmployees({ getState, setState }: StateContext<EmployeeSearchStateModel>) {
const state = getState();
return this.employeeService.getEmployees().pipe(tap((res: EmployeeSearch) => {
setState({
...state,
loading: false,
employees: res.userData
});
}));
}
我有一个状态选择器和操作如下
@Selector()
public static employees(state: EmployeeSearchStateModel) {
return state.employees;
}
@Action(FetchEmployees)
getEmployees({ getState, setState }: StateContext<EmployeeSearchStateModel>) {
const state = getState();
this.employeeService.getEmployees().pipe(tap((res: EmployeeSearch) => {
setState({
...state,
loading: false,
employees: res.userData
});
}));
}
现在,在一个组件中,我想将它与异步管道一起使用,但它不起作用。组件声明如下:
@Select(ManageEmployeeSearchState.employees) employees$: Observable<EmployeeI[]>;
ngOnInit(){
this.store.dispatch(new FetchEmployees());
}
在 HTML 中,当我尝试打印 <pre>{{ employees$ | async | json }}</pre>
时,它不起作用。我看不到后端 API 被调用。
但是,如果我将 pipe and tap
in Action 替换为 subscribe
,则一切正常。但是我不想订阅?
有线索吗?
如果您在状态中使用 pipe
运算符而不是调用订阅,则需要 return 将 Observable 发送给 NGXS,以便框架为您订阅它:
@Action(FetchEmployees)
getEmployees({ getState, setState }: StateContext<EmployeeSearchStateModel>) {
const state = getState();
return this.employeeService.getEmployees().pipe(tap((res: EmployeeSearch) => {
setState({
...state,
loading: false,
employees: res.userData
});
}));
}