NgRx EntityState-我们可以在状态对象属性上使用EntityState

时间:2019-10-10 07:16:25

标签: angular ngrx ngrx-entity

在进入NgRx的新旅程中,我刚刚发现了EntityState,如果我理解并尝试正确使用它,那么它涵盖了我需要做的所有“收集操作”操作对我来说!

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

我已经替换了我的一个要素状态对象中的对象数组,但是在选择时遇到了麻烦。

我有这个here的简单版本。

在此示例之后,状态为 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文件中,我使用了辅助方法updateBookList,该方法将使用EntityAdapter进行更新(不包括在内,但这就是应该的更新)。

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

现在,最后,(问题所在)在feature1.component.ts中,我要订阅选择器getAllBooks

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

在这里,我可以看到IDE报告了问题... enter image description here

错误正在......

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

所以,看来我的选择器有问题...

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

但是我不确定该如何解决我做错的事情。 fromFeature1.getBooks是对booksAdapter.getSelectors().selectAll;EntityAdapter的引用。我假设我需要以某种方式使用此EntityAdapter中的选择器来获取我的更新和状态,但是我不确定。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

export const getAllBooks = createSelector(
   getFeature1State,
   state => fromFeature1.getBooks(state.books) <--- pass in state.books
);