2016-04-06 2 views
20

Угловая версия: 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.

+0

Вам не нужен viewProvider, на самом деле я ищу его и не нашел ссылки, но я тестировал и работает с ** поставщиками **, а также с ** viewProviders **. Если вы все еще не уверены, создайте приложение для плунжера, чтобы увидеть его точно. – tibbus

+0

Это действительно странно, потому что это должно сработать. См. Этот plunkr: https://plnkr.co/edit/gG84YnQPItRSf0tIJSMK?p=preview. Мне было бы интересно узнать больше о вашей среде ;-) Спасибо! –

ответ

12

Его хорошо, если вы идете с Providers:[HTTP_PROVIDERS], но его хорошо обратиться HTTP_PROVIDERS в bootstrap(). Вам не нужно использовать viewProvider, он есть для других целей.

Вы должны убедиться, что http.dev.js был включен (через CDN/node_modules).

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.13/http.dev.js"></script> 

Тогда в rootComponent,

import {HTTP_PROVIDERS} from 'angular2/http'; 
import {GithubService} from './GithubService'; 

bootstrap(rootComponent,[HTTP_PROVIDERS,GithubService]); 

// if you reference HTTP_PROVIDERS here globally (in bootstrap), you don't require to use providers:[HTTP_PROVIDERS] in any component. 
// same way GithubService reference has been passed globally which would create single instance of GithubService (In case if you want) 

Тогда в GithubService,

import {Http} from 'angular2/http'; 

@Injectable() 
export class GithubService { 
    ... 
    constructor(private http: Http) { // this will work now without any error 
    } 
} 
+0

Спасибо, @micronyks. AFAIK, документация Angular 2 запрещает использование бутстрапа для регистрации поставщиков (см. [Здесь] (https://angular.io/docs/ts/latest/guide/dependency-injection.html)). Я решил проблему сейчас, переместив регистрацию на компонент, который в ней нуждается. Пожалуйста, см. Мой * Редактировать 2 *. – Naresh

+0

Я также читал это ;-) Я не думаю, что он применяется для провайдеров из Angular2, таких как «ROUTER_PROVIDERS» или «HTTP_PROVIDERS». Я думаю, что комментарий состоит в том, чтобы ограничить объем поставщиков в вашем приложении. Это «просто» способ организовать ваше приложение. Тем не менее, я думаю, что существуют случаи использования, когда необходимо определить некоторые из ваших услуг при загрузке приложения. Например, если вы хотите иметь общий сервис для разных частей. –

+0

@micronyks, я нашел еще одну ссылку, которая также предлагает не использовать загрузку для регистрации поставщиков: см. [Здесь] (https://github.com/mgechev/angular2-style-guide#services-and-dependency-injection). Пока я буду придерживаться этого совета. Спасибо за вашу помощь. – Naresh

20

После этой ссылке

Angular2/http Exception no ConnectionBackend Ответ @abreneliere является правильным для меня при работе с угловыми 2 Quickstart (https://angular.io/guide/quickstart) и я пытался добавить службу к компоненту.

Ответ: Файл: app.module.ts Код:

import { NgModule } from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { HttpModule } from "@angular/http"; 
import { AppComponent } from './app.component'; 

@NgModule({ 
    imports: [BrowserModule, HttpModule], 
    declarations: [AppComponent], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 
+0

Это сделало трюк для меня, используя '@ angular/http: ~ 2.4.0'. Простое решение. Ура! – mikeym

+0

Проголосуйте, если бы это произошло (Y) – SoProgram

+0

Уже проголосовали! – mikeym

0

Вы можете импортировать { HttpModule } в модуль, который имеет свой компонент объявленную, в котором вы используете инъекционный сервис, данный модуль не является ленивый загружен.

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