- Как мы делимся с использованием ngrx между ngModules?
- Как мы можем совместно использовать один экземпляр службы между ngModules?
Angular2-RC5.Как обмениваться услугами и заявлять между ngModules
Angular2-RC5.Как обмениваться услугами и заявлять между ngModules
Модули должны иметь один и тот же экземпляр службы. Для этого услуга должна находиться только в providers
вашего загрузочного лотка AppModule
. В противном случае, если одна и та же служба обнаружена у разных поставщиков, вы можете запускать параллельные экземпляры.
Итак, вопрос: как получить услугу на верхнем уровне providers
, но исключить его из всех других модулей?
С услугой Вы указываете, это действительно так.
AppModule
, п.т. его в том, что модуле providers
и нигдеDummyModule
) ваши, что вы импортирующей в другие модули, убедитесь, что не поместите его в DummyModule
providers
или Угловой инжектор создаст параллельный экземпляр его для каждого ленивого загружаемого модуля, который импортирует DummyModule
. Вместо этого вы хотите открыть эту службу из статического метода forRoot()
.Меняем:
@NgModule({
providers: [ MyService]
})
export class DummyModule{ }
To:
@NgModule({
providers: [] //empty since we want a singleton service
})
export class DummyModule{
static forRoot() {
return {ngModule: DummyModule, providers: [ MyService ]};
}
}
Теперь, когда обычные модули imports: [DummyModule]
, они не получат MyService
. С другой стороны, в AppModule
у вас есть imports: [DummyModule.forRoot()]
, который предоставляет услугу. В результате, только самый верхний компонент получает услугу, и у вас будет один экземпляр, который будет использоваться для всех модулей.
С сторонним сервисом это не просто.
В принципе, стороннему разработчику требуется внести изменения, если он также использует @NgModule
. В качестве альтернативы вместо импорта стороннего модуля вы можете создать настраиваемый модуль, который объявляет компоненты, трубы и директивы этого модуля, но реализует приведенное выше изменение для предоставления услуг этого модуля в методе forRoot()
.
Это то, что я сделал, чтобы получить услугу третьей стороны - MdIconService
(часть модуля углового материала) - работать как единый экземпляр, хотя его модуль еще не настроен должным образом. See this github issue.
Хорошо, я прочитал всю информацию о модулях на веб-сайте angular2, и теперь я понимаю, что вы написали, и это очень приятное решение. Я не могу принять этот ответ, потому что я до сих пор не понимаю, как делиться редукторами, объявленными в разных модулях. (или не будет никакого решения, и мы должны сделать это один раз в модуле приложения (thats sucks)). Благодаря! –
Просто, чтобы подтвердить, примерно год спустя, это действительно подход, защищенный ngrx 4. В своем примере приложения (части платформы repo) есть модуль, такой как DummyModule выше - он называется AuthModule. См. Https://github.com/ngrx/platform/blob/master/example-app/app/auth/auth.module.ts – Michael
Что вы подразумеваете под модулями? модулей или компонентов? – micronyks
Он означает '@ NgModule', как он сказал. Это правильный вопрос, я пытаюсь понять это самостоятельно, но я боюсь, что единственным решением на данный момент является просто вставить все в корневой модуль.Я думаю, нам нужно дождаться обновления ngrx для обновления до RC5. –
@Filip Lauc Спасибо за разъяснение. Маби другие проблемы, такие как ng2-redux, могут решить эту проблему? –