NgRx: модуль магазина, создающий несколько экземпляров - PullRequest
0 голосов
/ 21 сентября 2018

Я столкнулся с проблемой с моим кодом, использующим ngRx.Поскольку проект огромен и это скорее вопрос дизайна, извините, я не привожу минимальный и воспроизводимый пример.

У меня есть проект с такой структурой:

AppModule
    PrimaryOutletModule
        SidenavComponent
        HeaderComponent

ExploitationComponentsModule [lazy loaded in AppRouting]
    MapComponent
    MaService

ServicesModule [imported in AppModule]
    HttpServicesModule
        ExploitationServicesModule
            ExploitationService

В этой структуре я добавляю этот модуль к AppModule:

@NgModule({
  imports: [
    StoreModule.forRoot(exploitationReducers),
  ]
})
export class ExploitationStoreModule { }

Без каких-либо проблем, весь мой код работает хорошо.Но когда я добавляю его к PrimaryOutletModule, ExploitationComponentsModule и ExploitationServicesModule и удаляю его из AppModule, он перестает работать.

Я хочу удалить его из AppModule, чтобы избежать создания глобально доступных хранилищ (я хочу дать им значимые области видимости)

Моя первая мысль - записать события select и dispatchи когда я это делаю, я вижу, что события не улавливаются.После добавления этого в модуль:

constructor() { console.log('Store module instance created'); }

Я вижу два экземпляра.После этого вопроса SOF я понимаю, что должен использовать forRoot метод StoreModule.

Но так как мой ExploitationStoreModule уже использует его, я ищу решение и наткнулся на этот вопрос SOF , говоря, что лениво загруженные модули создают новые экземпляры модулей.

Если я правильно понял, я использую forRoot дважды, что приводит к двум экземплярам моего ExploitationStoreModule.

Поскольку я хочу предоставить правильные области действия для своих модулей и не разрешать им обращаться к магазинам, с которыми у них нет бизнеса (например, ExploitationModule не должен иметь доступа к SupervisionStore), я бынравится, чтобы меня не принуждали импортировать все мои модули Store в мой AppModule.

Возникает вопрос: как следует объявлять хранилища в приложении, чтобы они не были глобальными и предоставлялись только в соответствующих модулях?

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете использовать storeModule.forFeature в функциональных модулях.Но состояние станет доступным для всего вашего приложения при загрузке модуля.

Некоторые дополнительные ресурсы:

В хранилище хранится все дерево состояний вашего приложения, а послеПередовые практики: у вас должен быть только один магазин (в некоторых случаях производительность может быть проблемой, когда вам потребуется несколько магазинов, я связался с документами с избыточным количеством документов, у которых есть отличное объяснение).

Если вы импортируете свой магазинв ваш компонент, например, с помощью Store<FooState>, машинопись только знает о FooState, но на самом деле ваш магазин хранит состояние всего вашего приложения, например, также BarState.

Но лично мне не нужен доступ кхранить внутри моих компонентов, потому что я использую селекторы, которым на самом деле не нужен тип магазина.Например this.store.select(selectEmployees).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...