2016-08-27 3 views
2
  1. Как мы делимся с использованием ngrx между ngModules?
  2. Как мы можем совместно использовать один экземпляр службы между ngModules?

Angular2-RC5.Как обмениваться услугами и заявлять между ngModules

+0

Что вы подразумеваете под модулями? модулей или компонентов? – micronyks

+2

Он означает '@ NgModule', как он сказал. Это правильный вопрос, я пытаюсь понять это самостоятельно, но я боюсь, что единственным решением на данный момент является просто вставить все в корневой модуль.Я думаю, нам нужно дождаться обновления ngrx для обновления до RC5. –

+0

@Filip Lauc Спасибо за разъяснение. Маби другие проблемы, такие как ng2-redux, могут решить эту проблему? –

ответ

3

Модули должны иметь один и тот же экземпляр службы. Для этого услуга должна находиться только в providers вашего загрузочного лотка AppModule. В противном случае, если одна и та же служба обнаружена у разных поставщиков, вы можете запускать параллельные экземпляры.

Итак, вопрос: как получить услугу на верхнем уровне providers, но исключить его из всех других модулей?

С услугой Вы указываете, это действительно так.

  • Если служба является частью AppModule, п.т. его в том, что модуле providers и нигде
  • Если служба находится в другом модуле (давайте называть его DummyModule) ваши, что вы импортирующей в другие модули, убедитесь, что не поместите его в DummyModuleproviders или Угловой инжектор создаст параллельный экземпляр его для каждого ленивого загружаемого модуля, который импортирует 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.

+0

Хорошо, я прочитал всю информацию о модулях на веб-сайте angular2, и теперь я понимаю, что вы написали, и это очень приятное решение. Я не могу принять этот ответ, потому что я до сих пор не понимаю, как делиться редукторами, объявленными в разных модулях. (или не будет никакого решения, и мы должны сделать это один раз в модуле приложения (thats sucks)). Благодаря! –

+1

Просто, чтобы подтвердить, примерно год спустя, это действительно подход, защищенный ngrx 4. В своем примере приложения (части платформы repo) есть модуль, такой как DummyModule выше - он называется AuthModule. См. Https://github.com/ngrx/platform/blob/master/example-app/app/auth/auth.module.ts – Michael

Смежные вопросы