NgRx EntityState - Можем ли мы использовать EntityState для свойства объекта состояния - PullRequest
0 голосов
/ 10 октября 2019

Продолжая мое новое путешествие в 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

Ошибка: ....

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 голосов
/ 11 октября 2019

Я нашел свою проблему, мне просто нужно было передать state.books, как показано ниже ...

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