首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ngrx 9没有给我数据

ngrx 9没有给我数据
EN

Stack Overflow用户
提问于 2020-04-14 02:41:11
回答 1查看 55关注 0票数 0

我昨天开始学习ngrx。因此,为了一些实践,我决定用它重写我的组件。它曾经在没有ngrx的情况下工作得很好。我的showcase.component.ts:

代码语言:javascript
复制
@Component({
  selector: 'app-showcase',
  templateUrl: './showcase.component.html',
  styleUrls: ['./showcase.component.css']
})
export class ShowcaseComponent implements OnInit {
  books$ = this._store.pipe(select(selectShowcaseList));
  constructor(private _store: Store<IAppState>) {    
  }    
  ngOnInit(): void {
    this._store.dispatch(getBooks());
  }
}

showcase.effects.ts (我猜麻烦来了):

代码语言:javascript
复制
@Injectable()
export class ShowcaseEffects {
    getBooks$ = createEffect(() => this.actions$.pipe(
        ofType('[Showcase] getBooks'),
        mergeMap(() => this.booksService.getBooks()
          .pipe(
            map(books => ({ type: '[Showcase API] BooksLoaded Success', payload: books })),
            catchError(() => EMPTY)
          ))
        )
      );


    constructor(
        private actions$: Actions,
        private booksService: BookService,
        private _store: Store<IAppState>
    ) { }
}

showcase.reducer.ts:

代码语言:javascript
复制
export const showcaseReducer = createReducer(
    initialState,
    on(showcaseActions.getBooksSuccess, (state, {books}) => ({ ...state, books: books})),
)

showcase.actions.ts:

代码语言:javascript
复制
export const getBooks = createAction(
    '[Showcase] getBooks'
)

export const getBooksSuccess = createAction(
    '[Showcase API] BooksLoaded Success',
    props<{books: Observable<Book[]>}>()
);

showcase.state.ts:

代码语言:javascript
复制
export interface IShowCaseState {
    books: Observable<Book[]>;
}

export const initialState: IShowCaseState = {
    books: null
}

showcase.selectors.ts:

代码语言:javascript
复制
export const selectShowcase = (state: IAppState) => state.showcase;

export const selectShowcaseList = createSelector(
    selectShowcase,
    (state: IShowCaseState) => state.books
);

我的状态是:

代码语言:javascript
复制
export interface IAppState {
    showcase: IShowCaseState;
    test: ITestState;
}

export interface IShowCaseState {
    books: Book[];
}

export const initialState: IShowCaseState = {
    books: null
}

app.module:

代码语言:javascript
复制
@NgModule({
  declarations: [
    AppComponent,
    AuthenticationComponent,
    ShowcaseComponent,
    CartComponent,
    AccountComponent,
    CreateBookComponent,
    TestComponent //ttt
  ],
  imports: [
    AngularFireModule.initializeApp(environment.firebase),
    AngularFireDatabaseModule,
    BrowserModule,
    AppRoutingModule,
    //запихнуть в отдельный модуль
    StoreModule.forRoot({ books: fromShowcase.showcaseReducer, test: fromTest.testReducer }),
    EffectsModule.forRoot([ShowcaseEffects]),
    StoreDevtoolsModule.instrument({
      maxAge: 10
    }),
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Console告诉我变量book$是未定义的。对于我的目的,我还没有找到使用新的NGRX 9.X语法的好例子。如果你有任何NGRX 9.X应用程序的例子,其中使用了数据获取服务的效果,请给我一个链接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-14 06:11:55

你在有效载荷上发送了错误的数据。reducer期望的是一个具有books属性的对象,但它得到的却是一个图书数组。你可以通过稍微改变你的效果来修复它:

代码语言:javascript
复制
import * as fromActions from '...showcase.actions'

...

getBooks$ = createEffect(() => this.actions$.pipe(
  ofType(fromActions.getBooks),

  // instead of returning an empty operator in catchError, let's return an empty array
  switchMap(() => this.booksService.getBooks().pipe(catchError(() => of([])))),

  // the main problem in your code was this "payload: books"; use, instead, "payload: {books}"
  map(books => fromActions.getBooksSuccess({books})),
));

让我们来修复您的getBoosSuccess操作

代码语言:javascript
复制
export const getBooksSuccess = createAction(
    '[Showcase API] BooksLoaded Success',
    props<{books: Book[]}>()
);

另外,修复你的状态:

代码语言:javascript
复制
export interface IShowCaseState {
    books: Book[];
}

export const initialState: IShowCaseState = {
    books: []
}

我已经把一些东西组合在一起了on stackblitz

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61194460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档