【发布时间】:2019-12-03 00:08:48
【问题描述】:
我不是 Angular 的新手,但我是 ngrx 的新手。 我正在尝试从我的服务器获取一些值并将它们简单地打印到屏幕上,我可以看到这些值正在从服务器返回,之后效果捕获了动作并完成了它的工作:
但是我的简单组件没有显示任何内容:
ProfileComponent.ts:
export class ProfileComponent implements OnInit {
network$= this.store.select(a=>a.NetworkInfo)
profiles$: Observable<Profile[]> = this.store.select(state => state.Profiles);
constructor(private store:Store<NetAlertState>) { }
ngOnInit() {
this.store.dispatch({ type: '[Profile Component] getAllProfiles' });
this.store.dispatch({ type: '[Profile Component] getNetworkInfo' });
}
}
profile.component.html:
<div *ngFor="let profile of profiles$ | async">
{{ profile.name }}
</div>
net-alert.actions.ts:
export const getAllProfiles = createAction('[Profile Component] getAllProfiles');
export const getNetworkInfo = createAction('[Profile Component] getNetworkInfo');
export const loadProfilesSuccess = createAction('[Profile Component] loadProfilesSuccess',props<{items:Profile[]}>());
export const loadNetworkInfoSuccess = createAction('[Profile Component] loadNetworkInfoSuccess', props<NetworkInfo>());
export const loadProfilesFailure = createAction('[Profile Component] loadProfilesFailure',props<String>());
export const loadNetworkInfoFailure = createAction('[Profile Component] loadNetworkInfoFailure',props<String>());
net-alert.reducer.ts
export const initialState: NetAlertState = {
Profiles:null,
NetworkInfo:null,
isLoading: false,
error: null
}
export const NetAlertReducer = createReducer(
initialState,
on(NetAlertActions.getAllProfiles, state => ({ ...state,isLoading:true ,error:null})),
on(NetAlertActions.loadProfilesSuccess, (state,profiles) => ({ Profiles:profiles,...state ,isLoading:false ,error:null})),
on(NetAlertActions.loadProfilesFailure, (state,err) => ({ ...state,isLoading:false ,error:err})),
on(NetAlertActions.getNetworkInfo, state => ({ ...state ,isLoading:true ,error:null})),
on(NetAlertActions.loadNetworkInfoSuccess, (state,res) => ({ ...state,NetworkInfo:res,isLoading:false ,error:null})),
on(NetAlertActions.loadNetworkInfoFailure, (state,err) => ({ ...state,isLoading:false ,error:err})),
);
export function reducer(state: NetAlertState | undefined, action: Action) {
return NetAlertReducer(state, action);
}
net-alert.effects.ts:
@Injectable()
export class NetAlertEffects {
loadProfiles$ = createEffect(() =>
this.actions$.pipe(
ofType('[Profile Component] getAllProfiles'),
mergeMap(() => this.dataService.getAllProfiles()
.pipe(
map(res => ({ type: '[Profile Component] loadProfilesSuccess', payload: res })),
catchError(() => of({ type: '[Profile Component] loadProfilesFailure' }))
)
)
)
);
constructor(
private actions$: Actions,
private dataService: DataService
) {}
}
net-alert.state.ts:
export interface NetAlertState {
isLoading: boolean;
error: any;
NetworkInfo: NetworkInfo;
Profiles: Profile[];
}
export interface Profile {
Mac: string;
NickName: string;
CreateDate: Date;
Sites?: any;
}
root-state.ts:
export interface AppStates {
netAlert: NetAlertState;
}
export const netAlertReducers: ActionReducerMap<AppStates> = {
netAlert: netAlertRerucers.reducer
};
app.module.ts:
@NgModule({
declarations: [
AppComponent,
ProfileContainerComponent,
ProfileComponent
],
imports: [
HttpClientModule,
BrowserModule,
AppRoutingModule,
StoreModule.forRoot(netAlertReducers),
EffectsModule.forRoot([NetAlertEffects]),
StoreDevtoolsModule.instrument({
maxAge: 25, // Retains last 25 states
logOnly: environment.production, // Restrict extension to log-only mode
}),
RootStoreModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
谁能告诉我我的错误在哪里?
非常感谢!
【问题讨论】:
-
当您选择“State”而不是“Action”时,Redux DevTools 中是否显示
Profiles: []或类似内容? Toggle 按钮位于 Redux DevTools 的右上角。此外,我没有看到用于选择“netAlert”状态的选择器,您可以在此基础上构建其他选择器
标签: angular typescript ecmascript-6 redux ngrx