在进入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
);
错误正在......
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
中的选择器来获取我的更新和状态,但是我不确定。
在此先感谢您的帮助!
答案 0 :(得分:0)
我发现了问题,我只需要按如下所示传递state.books
...
export const getAllBooks = createSelector(
getFeature1State,
state => fromFeature1.getBooks(state.books) <--- pass in state.books
);