SelectAll from ngrx/entity 没有 select 任何东西
SelectAll from ngrx/entity doesn't select anything
简介
我在让我的选择器工作时遇到了一些问题。我的组件不会更新 FakeApiService
中的书籍,但我可以看到调用已完成。所以行动和效果正在发挥作用。
我认为问题与我对 @ngrx/Entity
的使用有关。特别是这个
export const getBooksState = createFeatureSelector<DemoState>('demo');
和
export const { selectAll } = fromBook.adapter.getSelectors();
我看过一些教程,他们向 getSelectors()
提供了一个选择器函数,但这不是必需的。
我希望有人能指出我哪里出错了,如果有人对 structure/setup 有什么建议,我洗耳恭听:)
这是我的设置。
版本
- Angular: 6.0.0
- rxjs 6.1.0
- 打字稿 2.7.2
- 网络包 4.6.0
- @ngrx/effects5.2.0
- @ngrx/entity5.2.0
- @ngrx/router-store5.2.0
- @ngrx/schematics 5.2.0
- @ngrx/store5.2.0
- @ngrx/store-devtools 5.2.0
ngRx
feature/store/actions/book.actions.ts
import { Action } from '@ngrx/store';
import { Book } from '../../models/book';
export enum BookActionTypes {
Load = '[Book] Load',
LoadSuccess = '[Book] Load Success',
LoadFail = '[Book] Load Fail'
}
export class LoadBooksAction {
readonly type = BookActionTypes.Load;
}
export class LoadBooksSuccessAction implements Action {
readonly type = BookActionTypes.LoadSuccess;
constructor(public payload: Book[]) {}
}
export class LoadBooksFailAction {
readonly type = BookActionTypes.LoadFail;
}
export type BookActions
= LoadBooksAction
| LoadBooksSuccessAction
| LoadBooksFailAction;
feature/store/effects/book.effects.ts
import { Injectable } from '@angular/core';
import { Actions, Effect } from '@ngrx/effects';
import { of } from 'rxjs';
import { catchError, map, switchMap } from 'rxjs/operators';
import { FakeApiService } from '../../services/fake-api.service';
import { LoadBooksFailAction, LoadBooksSuccessAction, BookActionTypes } from '../actions/book.actions';
@Injectable()
export class BookEffects {
constructor(
private fakeService: FakeApiService,
private actions$: Actions,
) {}
@Effect()
loadBooks$ = this.actions$
.ofType(BookActionTypes.Load)
.pipe(
switchMap(() => this.fakeService.getBooks()),
map(books => (new LoadBooksSuccessAction(books))),
catchError(error => of(new LoadBooksFailAction()))
);
}
feature/store/reducers/book.reducer.ts
import { EntityState, createEntityAdapter } from '@ngrx/entity';
import { Book } from '../../models/book';
import { BookActionTypes, BookActions } from './../actions/book.actions';
export interface BooksState extends EntityState<Book> {}
export const adapter = createEntityAdapter<Book>();
const initialState: BooksState = adapter.getInitialState();
export function reducer(state = initialState, action: BookActions ): BooksState {
switch (action.type) {
case BookActionTypes.LoadSuccess: {
return adapter.addAll(action.payload, state);
}
default: {
return state;
}
}
}
feature/store/reducers/index.ts
import { ActionReducerMap, createFeatureSelector } from '@ngrx/store';
import * as fromOrder from './book.reducer';
export interface DemoState {
demo: fromBook.BooksState;
}
export const reducers: ActionReducerMap<DemoState> = {
demo: fromBook.reducer
};
export const getBooksState = createFeatureSelector<DemoState>('demo');
feature/store/selectors/book.selectors.ts
import * as fromBook from '../reducers/book.reducer';
export const {selectAll} = fromBook.adapter.getSelectors();
Angular
feature/feature.module.ts
@NgModule({
imports: [
CommonModule,
StoreModule.forFeature('demo', reducer),
EffectsModule.forFeature([BookEffects])
],
providers: [FakeApiService],
declarations: []
})
export class DemoModule { }
feature/components/book-view.component.ts
@Component({
selector: 'app-book-view',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `<book-list [books]="books$ | async"></book-list>`
})
export class BookViewComponent implements OnInit {
books$: Observable<Book[]>;
constructor(private store: Store<fromStore.BooksState>) {
this.books$ = this.store.pipe(select(fromStore.selectAll));
}
ngOnInit() {
this.store.dispatch(new bookActions.LoadBooksAction());
}
}
问题出在您的选择器上;您必须将 book/demo 状态传递给 getSelectors 函数
import * as fromBook from '../reducers/book.reducer';
import { getBooksState } from '../reducers';
export const selectBookState = createSelector(
getBooksState,
state => state.demo
);
export const {
selectAll
} = fromBook.adapter.getSelectors(selectBookState);
看看我的回购和 url
简介
我在让我的选择器工作时遇到了一些问题。我的组件不会更新 FakeApiService
中的书籍,但我可以看到调用已完成。所以行动和效果正在发挥作用。
我认为问题与我对 @ngrx/Entity
的使用有关。特别是这个
export const getBooksState = createFeatureSelector<DemoState>('demo');
和
export const { selectAll } = fromBook.adapter.getSelectors();
我看过一些教程,他们向 getSelectors()
提供了一个选择器函数,但这不是必需的。
我希望有人能指出我哪里出错了,如果有人对 structure/setup 有什么建议,我洗耳恭听:)
这是我的设置。
版本
- Angular: 6.0.0
- rxjs 6.1.0
- 打字稿 2.7.2
- 网络包 4.6.0
- @ngrx/effects5.2.0
- @ngrx/entity5.2.0
- @ngrx/router-store5.2.0
- @ngrx/schematics 5.2.0
- @ngrx/store5.2.0
- @ngrx/store-devtools 5.2.0
ngRx
feature/store/actions/book.actions.ts
import { Action } from '@ngrx/store';
import { Book } from '../../models/book';
export enum BookActionTypes {
Load = '[Book] Load',
LoadSuccess = '[Book] Load Success',
LoadFail = '[Book] Load Fail'
}
export class LoadBooksAction {
readonly type = BookActionTypes.Load;
}
export class LoadBooksSuccessAction implements Action {
readonly type = BookActionTypes.LoadSuccess;
constructor(public payload: Book[]) {}
}
export class LoadBooksFailAction {
readonly type = BookActionTypes.LoadFail;
}
export type BookActions
= LoadBooksAction
| LoadBooksSuccessAction
| LoadBooksFailAction;
feature/store/effects/book.effects.ts
import { Injectable } from '@angular/core';
import { Actions, Effect } from '@ngrx/effects';
import { of } from 'rxjs';
import { catchError, map, switchMap } from 'rxjs/operators';
import { FakeApiService } from '../../services/fake-api.service';
import { LoadBooksFailAction, LoadBooksSuccessAction, BookActionTypes } from '../actions/book.actions';
@Injectable()
export class BookEffects {
constructor(
private fakeService: FakeApiService,
private actions$: Actions,
) {}
@Effect()
loadBooks$ = this.actions$
.ofType(BookActionTypes.Load)
.pipe(
switchMap(() => this.fakeService.getBooks()),
map(books => (new LoadBooksSuccessAction(books))),
catchError(error => of(new LoadBooksFailAction()))
);
}
feature/store/reducers/book.reducer.ts
import { EntityState, createEntityAdapter } from '@ngrx/entity';
import { Book } from '../../models/book';
import { BookActionTypes, BookActions } from './../actions/book.actions';
export interface BooksState extends EntityState<Book> {}
export const adapter = createEntityAdapter<Book>();
const initialState: BooksState = adapter.getInitialState();
export function reducer(state = initialState, action: BookActions ): BooksState {
switch (action.type) {
case BookActionTypes.LoadSuccess: {
return adapter.addAll(action.payload, state);
}
default: {
return state;
}
}
}
feature/store/reducers/index.ts
import { ActionReducerMap, createFeatureSelector } from '@ngrx/store';
import * as fromOrder from './book.reducer';
export interface DemoState {
demo: fromBook.BooksState;
}
export const reducers: ActionReducerMap<DemoState> = {
demo: fromBook.reducer
};
export const getBooksState = createFeatureSelector<DemoState>('demo');
feature/store/selectors/book.selectors.ts
import * as fromBook from '../reducers/book.reducer';
export const {selectAll} = fromBook.adapter.getSelectors();
Angular
feature/feature.module.ts
@NgModule({
imports: [
CommonModule,
StoreModule.forFeature('demo', reducer),
EffectsModule.forFeature([BookEffects])
],
providers: [FakeApiService],
declarations: []
})
export class DemoModule { }
feature/components/book-view.component.ts
@Component({
selector: 'app-book-view',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `<book-list [books]="books$ | async"></book-list>`
})
export class BookViewComponent implements OnInit {
books$: Observable<Book[]>;
constructor(private store: Store<fromStore.BooksState>) {
this.books$ = this.store.pipe(select(fromStore.selectAll));
}
ngOnInit() {
this.store.dispatch(new bookActions.LoadBooksAction());
}
}
问题出在您的选择器上;您必须将 book/demo 状态传递给 getSelectors 函数
import * as fromBook from '../reducers/book.reducer';
import { getBooksState } from '../reducers';
export const selectBookState = createSelector(
getBooksState,
state => state.demo
);
export const {
selectAll
} = fromBook.adapter.getSelectors(selectBookState);
看看我的回购和 url