Продолжая мое новое путешествие в 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
, которое запускается при появлении новых данныхприходит с сервера, а в файле редуктора я используювспомогательный метод updateBookList
, который будет использовать все различные методы EntityAdapter
для выполнения обновлений (не включены, но там, где они должны быть).
Пока все выглядит нормально ..
Теперь, наконец, (, где проблема ) находится в feature1.component.ts
, где я хочу подписаться на селектор getAllBooks
this.store.pipe(select(fromLibrary.getAllBooks),
).subscribe(
books => this.libaryModel.books = books
);
Здесь я вижуIDE сообщает о проблеме ... ![enter image description here](https://i.stack.imgur.com/wmSG3.png)
Ошибка: ....
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
для получения обновлений и состояния, но я просто не уверен.
Заранее спасибо за любую помощь!