1

继续我的新旅程NgRx,我刚刚发现EntityState,如果我理解并尝试正确使用它,它涵盖了我需要为我做的所有“集合操作”操作!

我遵循了这个优秀的教程,有一个小区别,我想(如果可能的话)使用EntityState我的状态对象的属性,而不是将其扩展为整个状态对象,如链接示例中)。我这样做是为了匹配我现有的数据,并可能允许另一个列表属性也是一个EntityState(如果它可以以这种方式使用,再一次)。

我已经替换了我的一个功能状态对象中的对象数组,但是在选择时遇到了问题。

我在这里有一个简单的版本。

在此示例之后,状态为feature1,为简单起见,我只是将其放入文件夹而不是单独的模块中。

我的应用程序有现有的类,我在其中序列化来自服务器的数据。

我已将这些放入 freature1.reducers.ts 文件中。

 export class BookModel {
      public id : string;
      public title: string;
    }

 /** Serialised in from the backend */
 export class LibraryBackendModel {
      books: Array<BookModel>;
    }

所以我为我想要存储的状态声明了接口,Array<BookModel>我希望我可以用这个来替换EntityState

所以,功能状态,我有以下(在同一个文件中)......

export interface LibraryState {
  isOpen : boolean,
  books: EntityState<BookModel> // <----- now using EntityState instead of an array

  // Maybe other collections to come
}

我有一个动作getLibrarySuccess,当新数据从服务器进来时触发,在 reducer 文件中,我使用 helper 方法updateBookList,它将使用所有各种方法EntityAdapter来进行更新(不包括在内,但这就是它们所在的位置)。

到目前为止,一切似乎都很好..

现在终于,(问题出在哪里)在feature1.component.ts,我想订阅选择器getAllBooks

 this.store.pipe(select(fromLibrary.getAllBooks),
      ).subscribe(
        books => this.libaryModel.books = books
      );

在这里,我可以看到 IDE 报告了一个问题:

在此处输入图像描述

错误是......

Type '(state: EntityState<BookModel>) => BookModel[]' is not assignable to type 'BookModel[]'.

所以,我的选择器似乎有问题......

export const getAllBooks = createSelector(
   getFeature1State,
   state => fromFeature1.getBooks
 );

但我不知道如何解决这个问题,我做错了什么。是对来自的fromFeature1.getBooks引用。我假设我需要以某种方式使用其中的选择器来获取我的更新和状态,但我不确定。booksAdapter.getSelectors().selectAll;EntityAdapterEntityAdapter

4

1 回答 1

1

我发现了我的问题,我只需要传递state.books如下...

export const getAllBooks = createSelector(
   getFeature1State,
   state => fromFeature1.getBooks(state.books) <--- pass in state.books
);
于 2019-10-11T04:53:10.590 回答