继续我的新旅程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;
EntityAdapter
EntityAdapter