2017-02-08 4 views
1

У меня есть AppModule который импортирует CoreModule. Purpouse из CoreModule является обращаться с услугами доступа к данным, так CoreModule обеспечивает UserService, PlansService и так далее:Angular2: Unhandled Promise rejection: Нет провайдера для @Injectable

@NgModule({ 
    providers: [ 
    UsersService, 
    PlansService, 
    { 
     provide: LocationStrategy, 
     useClass: ('production' === ENV ? HashLocationStrategy : PathLocationStrategy) 
    } 
    ] 
}) 
export class CoreModule { } 

Так на AppModule я импортировать его:

@NgModule({ 
    bootstrap: [ App ], 
    declarations: [ 
    App, 
    ErrorComponent 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule, 
    CoreModule, <<<<<<<<<<<<<<<<<< 
    RouterModule.forRoot(ROUTES, { useHash: true }) 
    ] 
}) 
export class AppModule { 

Тем не менее, на LoginComponent угловом говорит я не получаю провайдера для UserService:

@Component({ 
    ... 
}) 
export class LoginComponent implements OnInit { 

    constructor(private commty: UsersService) 

LoginModule загружается lazyly в соответствии с его конфигурацией маршрутизатора и это:

export const routes = [ 
    { path: '', component: LoginComponent, pathMatch: 'full' } 
]; 

@NgModule({ 
    declarations: [ 
    LoginComponent 
    ], 
    imports: [ 
    CommonModule, 
    ReactiveFormsModule, 
    AlertModule, 
    RouterModule.forChild(routes), 
    ], 
}) 
export default class LoginModule { 
    static routes = routes; 
} 

Что я делаю неправильно? Нужно ли мне importCoreModule innto LoginModule? Если я это сделаю, то как насчет CoreModule экземпляров? Загружается ли он дважды?

Это ошибка, я получаю от углового:

Unhandled Promise отказ: Нет кормильцем UsersService!

+0

Да, вы должны импортировать CoreModule в LoginModule, потому что нет никакого отношения между ними. Это должен быть только один экземпляр, но вы можете его протестировать. –

+0

Спасибо @Igor. Он все еще не работает. Сообщение одно и то же. – Jordi

+0

У вас есть аннотация @Injectable() на ваших классах XxxService? –

ответ

0

Вам не нужно импортировать CoreModule в LoginModule. Вы можете просто решить проблему, установив UserService в качестве поставщика LoginComponent.

LoginComponent:

@Component({ 
    providers: [ UsersService ] 
    //... 
}) 
export class LoginComponent implements OnInit { 
    constructor(private commty: UsersService) 
} 
+0

Если я использую этот apporach, 'UserService' будет инстанцироваться несколько раз, не так ли? – Jordi

+0

Да, это уже не singleton – Faly

0

, потому что вы используете ленивую загрузку, вам нужно импортировать CoreModule в обоих ленивым и не ленивым модуль.

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

https://angular-2-training-book.rangle.io/handout/modules/shared-modules-di.html

@NgModule({ 
    declarations: [ 
    LoginComponent 
    ], 
    imports: [ 
    CommonModule, 
    ReactiveFormsModule, 
    AlertModule, 
    CoreModule, // <- here 
    RouterModule.forChild(routes), 
    ], 
}) 
export default class LoginModule { 
    static routes = routes; 
} 
+0

Спасибо за ваш комментарий. Согласно документации, которую вы написали, это должно быть так. Тем не менее, он продолжает терпеть неудачу !!? Это действительно странно! Сообщение такое же ... – Jordi

+0

О, я использую этот способ для реализации ленивой загрузки тоже. Кстати, вы назвали ваш сервис 'UsersService' или просто' UserService' –

+0

'UsersService', почему? – Jordi

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