Путаница в использовании службы в директиве основного модуля

У меня есть основной модуль с именем CoreModule, он содержит службу с именем MapManagerService, директиву с именем FlyToDirective, которая использует MapManagerService, и компонент с именем ElementComponent, который использует flyTo.

Мой AppModule импортирует CoreModule и использует его компоненты, плюс собственный MapManagerService

Прочитав документацию основных модулей Angular, вы заметит:

Точнее, Angular накапливает всех импортированных поставщиков перед добавлением элементов, перечисленных в @NgModule.providers. Эта последовательность гарантирует, что все, что мы явно добавляем к поставщикам AppModule, имеет приоритет над поставщиками импортированных модулей.

НО, FlyToDirective по-прежнему использует импортированный MapManagerService CoreModule, я неправильно понимаю документацию?

Я решил, что следует использовать службу AppModules MapManagerService, а не CoreModules

Любая помощь будет оценена, спасибо.


person Kesem David    schedule 13.02.2017    source источник
comment
Пожалуйста, опубликуйте код. Что означает «плюс» собственный MapManagerService?   -  person Günter Zöchbauer    schedule 13.02.2017


Ответы (1)


Все провайдеры, добавленные в providers: [...] модуля без отложенной загрузки, переносятся в корневую область приложения. Там один и тот же провайдер прописан в нескольких таких модулях, действует только тот, который был импортирован последним.

Однако провайдеры, добавленные непосредственно в AppModule, имеют приоритет над провайдерами импортированных модулей.

Вы можете добавить поставщика в @Component({providers: [...]}), тогда компонент и его потомки получат экземпляр от этого поставщика, а не от поставщика корневой области приложения.

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

person Günter Zöchbauer    schedule 13.02.2017
comment
Спасибо за быстрый ответ! параметр providers устарел? Пробовал, не помогло, более того его нет в Component d.ts - person Kesem David; 13.02.2017
comment
FlyToDirective импортирует MapManagerService из CoreModule, я ожидал, что импортированный MapManagerService будет службой AppModule при использовании ElementComponent в AppModule, но вместо этого это все еще CoreModules. Я хочу, чтобы поведение каждого модуля было одинаковым, когда они разделены, но когда CoreModule импортируется, директива должна использовать MapManagerService AppModule. - person Kesem David; 13.02.2017
comment
Если вы не предоставите код, демонстрирующий, что вы сделали, я не смогу вам помочь. У меня нет мотивации строить ментальную модель кода из вашего словесного объяснения, потому что вы можете просто опубликовать его. - person Günter Zöchbauer; 13.02.2017
comment
providers не считается устаревшим. Без providers не может быть никаких сервисов. Также providers в @Component() не устарело, если вы имеете в виду это. - person Günter Zöchbauer; 13.02.2017