Можно ли разделить хранилище NGXS между отдельными угловыми (под) проектами? - PullRequest
7 голосов
/ 15 марта 2019

Ситуация : у меня есть микро-интерфейс, созданный из основного приложения Angular, и множество библиотек Angular, импортированных как модули, содержащие компоненты, которые ведут себя как «подпрограммы».

Цель : я хочу поделиться хранилищем NGXS, созданным в главном приложении, между всеми подприложениями, чтобы каждое подприложение имело свой собственный фрагмент глобального состояния и могло иметь доступ к глобальному состояние также.

В приложении хоста я создаю состояние следующим образом:

@State<ApplicationStateModel>({
  name: 'host',
  defaults: {
    context: {
      language: 'en'
    },
    apps: {}
  }
})
export class ApplicationState {...}

и в подпрограммах я хочу иметь возможность отправлять действия, а также вырезать это состояние, что-то вроде:

constructor(private store: Store) {
   // slice the context
   this.context$ = this.store.select(state => state.host.context);
   // slice this sub-app state
   this.state$ = this.store.select(state => state.host.apps['myapp']);
}

...

// dispatch an action
this.store.dispatch(new UpdateContext());

Проблема : как я могу передать хранилище из хост-приложения во вспомогательные приложения? Я предполагаю, что мог бы быть способ сделать это, используя функции .forRoot() или .forFeature() модуля во время импорта, но я полностью потерян.

1 Ответ

1 голос
/ 20 марта 2019

Вы можете использовать методы store.snapshot() и store.reset() для этого.

Давайте предположим, что ваши модели состояний совпадают во всех ваших приложениях ... Ваше главное приложение содержит действительное хранилище -> главное приложение вызывает store.snapshot(), сериализует объект снимка и передает его в ваше вспомогательное приложение (используя длинные веб-сокеты опрос, или что у вас есть) -> ваше подприложение, получив сериализованный снимок, десериализует его и вызывает store.reset(), передавая объект снимка.

Это не гарантирует, что магазины будут синхронизированы, хотя. Изменение состояния в вложенном приложении будет изменять состояние только там. Вы можете отменить передачу моментального снимка, чтобы распространить состояние обратно. Как видите, это может довольно быстро запутаться ...

Лучшим подходом было бы использование какого-либо механизма сквозных событий для передачи NGXS рассылок действий клиентам, которые подписались на него. Например, для .NET вы можете использовать SignalR (https://dotnet.microsoft.com/apps/aspnet/real-time).. Существуют и другие реализации для других стеков.

Надеюсь, это немного поможет: -)

...