Угловая версия: 2.0.0-beta.13Инъекция http в сервисе дает «Нет провайдера для Http!» Ошибка
Я пытаюсь внедрить http
в сервис:
@Injectable()
export class GithubService {
...
constructor(private http: Http) {
}
}
Я перечисленный HTTP_PROVIDERS
в качестве поставщика в корневом компоненте моего приложения, так этот провайдер должен быть доступен для любого компонента в моем приложении:
@Component({
providers: [HTTP_PROVIDERS],
})
export class AppComponent {}
Однако, когда я запускаю это приложение, я получаю следующее сообщение об ошибке:
EXCEPTION: Error: Uncaught (in promise): No provider for Http! (HttpReqComponent -> GithubService -> Http)
Что я делаю неправильно?
Редактировать
Я изменил providers
к viewProviders
и ошибка теперь пошли!
@Component({
viewProviders: [HTTP_PROVIDERS],
})
export class AppComponent {}
Однако я не могу объяснить, почему это работает. http
не имеет доступа к какому-либо виду напрямую. Доступ к нему осуществляется только внутри GithubService
. Так почему я должен объявить HTTP_PROVIDERS
как viewProvider
?
Edit 2
Ну, я переместил providers
декларацию от AppComponent вниз к компоненту, где мне нужно, и теперь он работает! Поэтому при объявлении его на корневом уровне должно быть какое-то причуда.
@Component({
providers: [HTTP_PROVIDERS, GithubService],
})
export class HttpReqComponent { }
На самом деле, оба providers
и viewProviders
работы. Оказывается, что viewProviders
на самом деле более ограничительный и обеспечивает лучшую инкапсуляцию компонента. См. this article.
Вам не нужен viewProvider, на самом деле я ищу его и не нашел ссылки, но я тестировал и работает с ** поставщиками **, а также с ** viewProviders **. Если вы все еще не уверены, создайте приложение для плунжера, чтобы увидеть его точно. – tibbus
Это действительно странно, потому что это должно сработать. См. Этот plunkr: https://plnkr.co/edit/gG84YnQPItRSf0tIJSMK?p=preview. Мне было бы интересно узнать больше о вашей среде ;-) Спасибо! –