【发布时间】:2021-03-05 14:58:12
【问题描述】:
我正在 Angular 11 中使用 NGRX(状态管理)。
我正在显示组件加载的租户列表。使用 NGRX 效果,实际上我通过服务请求 http 调用。
这是我的效果
@Injectable()
export class TenantsListEffects {
constructor(private actions$: Actions, private tenantListService:
TenantAdministrationService) { }
loadTenants$ = createEffect(() => this.actions$.pipe(
ofType(TenantsListActions.TenantsListActionTypes.LoadTenantsLists),
switchMap(
((action) => this.tenantListService.getAllTenantsUsingGET().pipe(
map(tenants => { return new TenantsListActions.LoadTenantsListsSuccess({
data: tenants }) }),
catchError(err => of(new TenantsListActions.LoadTenantsListsFailure({
error: err })))
)
)
))
)
}
这是我的tenantList.reducer.ts
export const tenantsListFeatureKey = 'tenantsListState';
export interface tenantsListState {
tenants: DisplayNameToTenantMappingResponse[],
loading: boolean,
error: string
}
export const initialState: tenantsListState = {
tenants: [],
loading: false,
error: ''
};
export function reducer(state = initialState, action: TenantsListActions): tenantsListState {
switch (action.type) {
case TenantsListActionTypes.LoadTenantsLists:
return {
...state,
loading: true
}
case TenantsListActionTypes.LoadTenantsListsSuccess:
return {
...state,
tenants: action.payload.data,
loading:false,
error: null
}
case TenantsListActionTypes.LoadTenantsListsFailure:
return {
...state,
error: action.payload.error,
loading: false
}
default:
return state;
}
}
这是我的选择器
const getTenantsListState = createFeatureSelector<tenantsListState>('tenantsListState');
export const getTenants = createSelector(
getTenantsListState,
state => state.tenants
)
export const getError = createSelector(
getTenantsListState,
state => state.error
)
这是我的服务
@Injectable({
providedIn: 'root'
})
export class TenantAdministrationService {
public basePath: string ='';
constructor(private basePathService: BasePathService,private http:
HttpClient) {
this.basePath = this.basePathService.selectEnv();
}
public
getAllTenantsUsingGET():Observable<DisplayNameToTenantMappingResponse[]>{
let test = this.http.get<Array<DisplayNameToTenantMappingResponse>>
(`${this.basePath}/admin/tenant`);
console.log('get list ', test);
return test
}
问题是
当我第一次调用该服务时,它没有重新调整任何内容,因此它没有在我的 ngrx 商店中存储任何东西。 但在 2 到 3 秒后,它会返回租户列表并作为状态存储在商店中。
我尝试为我的服务调用方法创建异步功能,但它导致效果错误。
那么有人可以帮我解决这个问题吗....
【问题讨论】:
-
请添加真实代码,代码截图为无代码。
-
嗨,我用真实代码编辑过。
标签: angular typescript ngrx