我正在尝试将ngrx v4实现到我的angular项目中,并努力从ngrx存储中获取数据。我根据提供的api文档编写了Actions、Reducer和Effects
github page
在我看来,一切都是正确的,但我得到的不是这样的数据存储状态:
因此,如果有人能帮我找出我的错误所在,我将不胜感激。提前谢谢。下面是我的代码
界面ts
export interface Category {
id?: number;
name: string;
used: boolean;
}
行动。ts
import { Action } from '@ngrx/store';
import {Category} from '../categories';
export const GET_CATEGORIES = '[Category] Get data';
export const GET_CATEGORIES_ERROR = '[Category] Get data error';
export const GET_CATEGORIES_SUCCESS = '[Category] Get data success ';
export class GetCategories implements Action {
readonly type = GET_CATEGORIES;
}
export class GetCategoriesError implements Action {
readonly type = GET_CATEGORIES_ERROR;
}
export class GetCategoriesSuccess implements Action {
readonly type = GET_CATEGORIES_SUCCESS;
constructor(public payload: Category[]) { }
}
export type All = GetCategories | GetCategoriesSuccess | GetCategoriesError
减速器。ts
import * as CategoriesActions from './categories.actions';
import {Category} from '../categories';
export type Action = CategoriesActions.All;
export function categoriesReducer (state: Category[], action: Action) {
switch (action.type) {
case CategoriesActions.GET_CATEGORIES: {
return state;
}
case CategoriesActions.GET_CATEGORIES_ERROR: {
return state;
}
case CategoriesActions.GET_CATEGORIES_SUCCESS: {
return action.payload;
}
default: {
return state;
}
}
}
影响。ts
...
import {CategoriesService} from './categories.service';
@Injectable()
export class CategoriesEffects {
@Effect() getCategories$: Observable<Action> = this.actions$
.ofType('GET_CATEGORIES')
.mergeMap(action => this.categoriesService.getCategories()
.map(data => ({type: 'GET_CATEGORIES_SUCCESS', payload: data }))
.catch(() => of({ type: 'GET_CATEGORIES_ERROR', payload: {message: 'Oops something is wrong'} }))
);
constructor(
private actions$: Actions,
private categoriesService: CategoriesService
) {}
}
组成部分ts
interface CategoryState {
categories: Category[]
}
@Component({
selector: 'app-categories',
templateUrl: './categories.component.html',
styleUrls: ['./categories.component.css'],
})
export class CategoriesComponent implements OnInit {
categories$: Observable<Category[]>;
constructor(private store: Store<CategoryState>) {
console.log(this.categories$) // undefined
this.categories$ = this.store.select('categories');
console.log(this.categories$) // store state
}
ngOnInit() {
this.getCategories()
}
getCategories () {
this.store.dispatch({ type: 'GET_CATEGORIES' });
}
}
单元
@NgModule({
imports: [
...
StoreModule.forRoot({ categories: categoriesReducer }),
EffectsModule.forRoot([CategoriesEffects]),
],
declarations: [ CategoriesComponent ],
providers: [ CategoriesService ],
entryComponents: []
})
export class CategoriesModule {}