2016-05-11 3 views
28

Я хочу, чтобы внедрить услугу другой службы:Угловая 2: Услуга Inject для другой службы. (Нет ошибки поставщика)

@Injectable() 

export class Dispatcher { 
} 


@Injectable() 

export class TodoStore { 

    constructor(@Inject(Dispatcher) dispatcher:Dispatcher){ 

    } 
} 

Но я всегда получаю ошибку: Нет поставщика для диспетчера!

Спасибо.

+2

'@Inject (Dispatcher)' избыточно, если тип параметра тот же. –

+1

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

ответ

32

Вам нужно provide ваше обслуживание где-нибудь. Пожалуйста, обратитесь к angular2 docs

Вы могли бы обеспечить его бутстраповский метод:

bootstrap(AppComponent,[TodoStore,Dispatcher]); 

или компонент приложения:

@Component({ 
    ... 
     providers:[TodoStore,Dispatcher] 
} 
... 

Или в любом другом компоненте, в зависимости от ваших потребностей.

Кроме того, в конструкторе не требуется @Inject(Dispatcher). Это в основном так же, как

constructor(dispacher:Dispatcher){ 
} 

Ах да, добро пожаловать :) ТАК

+1

Мне все еще нужен '@Inject (Dispactcher)' в конструкторе, чтобы он работал. –

+0

Как насчет того, вызван ли метод async? вы не можете получить доступ к тому, который был введен в конструктор, вам все равно нужно вставить его самому методу. Так: служба @Inject ('Service') –

+0

@AlejandroLora Я не уверен, что правильно понял вашу точку. Но, я думаю, вы используете «это» неправильно. Если моя догадка правильная, ваша проблема не связана с инъекцией. См. [Этот пост] (http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback). Если мое предположение неверно, просьба предоставить плункеру пример проблемы. – Abdulrahman

5

Благодарю за ответ.

Поскольку это не компонент, решение @Component (...) не применяется.

bootstrap(AppComponent,[TodoStore,Dispatcher]); 

решение работает. Но это делает это main.ts центральным местом.

+2

Почему, по вашему мнению, '@Component()' не работает? '@Component()' - это место, где вы регистрируете провайдера, он все равно может быть инжектором для службы. –

+1

@ GünterZöchbauer, но служба не имеет декоратора @ Component, поэтому, если вы хотите входить в службу внутри другой службы, вы вынуждены включать ее в bootstrap(), почему можно указать поставщика в компоненте @ и всех его потомках ; но не в простом сервисе parent .. без @ Component decorator, просто в простом классе. Пример: mock.service.ts: import {Injectable} из '@ angular/core'; импорт {HEROES} из './mock-heroes'; @Injectable() export class MockService { getHeroes() {return HEROES; } } – stackdave

+0

Я вижу. '@Component()' не упоминался в вопросе, поэтому я задавался вопросом, почему это вообще было упомянуто в ответе. –

-6

Попробуйте это:

myMainService.ts

import { myOtherService } from 'myOtherService'; 

export class myMainService { 
constructor() { 
    let myOtherService = new myOtherService(); 
} 
} 

myOtherService.ts

export class myOtherService { 
    constructor() { 
     console.log('service was imported'); 
    } 
} 
+0

Это не так, как это сделать, поскольку зависимость не вводится, а жестко связана. Подумайте о том, чтобы написать специализированный поставщик услуг, в котором вы создаете, ввести «другую услугу» в свою «главную службу», – cmonsqpr

-1

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

@NgModule({ 
    declarations:[...], 
    imports:[...], 
    providers: [MyCustomService], 
    bootstrap:[AppComponent] 
}) 
Смежные вопросы