Angular версия: 2.0.0-beta.13
Я пытаюсь ввести http
в службу:
@Injectable()
export class GithubService {
...
constructor(private http: Http) {
}
}
Я перечислил HTTP_PROVIDERS
как поставщика корневого компонента моего приложения, поэтому этот поставщик должен быть доступен для любого компонента в моем приложении:
@Component({
providers: [HTTP_PROVIDERS],
})
export class AppComponent {}
Однако, когда я запускаю это приложение, я получаю следующую ошибку:
ИСКЛЮЧЕНИЕ: Ошибка: Неподготовлено (в обещании): Нет провайдера для Http! (HttpReqComponent → GithubService → Http)
Что я делаю неправильно?
Edit
Я изменил providers
на viewProviders
, и ошибка теперь исчезла!
@Component({
viewProviders: [HTTP_PROVIDERS],
})
export class AppComponent {}
Однако я не могу объяснить, почему это работает. http
не просматривается ни одним представлением напрямую. Доступ к нему осуществляется только внутри GithubService
. Итак, почему я должен объявить HTTP_PROVIDERS
как viewProvider
?
Изменить 2
Ну, я переместил объявление providers
из AppComponent до того компонента, в котором он мне нужен, и теперь он работает! Поэтому при объявлении его на корневом уровне должно быть какое-то причуда.
@Component({
providers: [HTTP_PROVIDERS, GithubService],
})
export class HttpReqComponent { }
На самом деле работают как providers
, так и viewProviders
. Оказывается, что viewProviders
на самом деле более ограничительный и обеспечивает лучшую инкапсуляцию компонента. Подробнее см. в этой статье.