2016-02-15 2 views
4

Я пытаюсь удалить зависимость компонентов на сервисах в Angular с помощью Redux.Как внедрить провайдера в услугу Angular 2 от действия?

В основном, поток Компонент -> Action -> Сервис

В службе я хочу использовать HTTP модуль @ угловой/ядра, которое предлагается передать в конструктор:

export class SampleService { 
    constructor(public http: Http) {} 
} 

И поскольку я звоню в службу из-за действия, он не получит поставщика http, поскольку у меня нет экземпляра поставщика http в нем.

export default class SampleAction { 
    private _projectService; 
    constructor() { 
     this._sampleService = new SampleService(); 
    } 
} 

Как я могу ввести поставщика http в службу?

ответ

2

В своем действии вы можете ввести конструктор Http в конструктор и передать его в экземпляр службы. Что-то вроде

export default class SampleAction { 
    private _projectService; 
    constructor(@Inject(Http) http: Http) { 
     this._sampleService = new SampleService(http); 
    }  
} 
+0

Спасибо, Видхья! Он работал с использованием этого подхода. – Sanjeev

0

На самом деле вам не нужно создавать экземпляр службы самостоятельно. Просто вставьте услугу в компонент или другую службу. Важно, чтобы провайдер настроил этот поток выполнения. В вашем случае Http (и, в целом, HTTP_PROVIDERS) и SampleSampleService. Поставщики определены для всего приложения (на уровне начальной загрузки) или для компонента (атрибут providers).

bootstrap(AppComponent, [ HTTP_PROVIDERS, SampleService ]); 

или

@Component({ 
    providers: [ HTTP_PROVIDERS, SampleService ] 
}) 
export class SomeComponent { 
    constructor(private action: SampleAction) { 
    } 

    executeAction() { 
    this.action.doSomething(); 
    } 
} 

Вот код, который вы должны использовать для SampleAction класса:

export default class SampleAction { 
    constructor(private _projectService: SampleService) { 
    } 
} 

Вы можете заметить, что, чтобы иметь возможность вводить в службе, @Injectable потребность быть использованным.

@Injectable() 
export class SampleService { 
    constructor(public http: Http) {} 
} 

Этот ответ может дать вам больше намеков о том, как использовать инъекции зависимостей и как иерархические инжекторы работает в Angular2:

+0

Спасибо за помощь Тьерри, но я ищу решение, в котором компонент не должен знать об услуге. – Sanjeev

+0

Что вы подразумеваете под «не должны знать об услуге»? Как бы ваш компонент звонил в службу? –

+0

Компонент должен отправить действие как в flux/redux, и затем действие будет использовать промежуточное программное обеспечение для вызова службы. – Sanjeev

0

Не создать экземпляр службы с помощью new SomeService().

Вместо этого просто добавьте классы поставщикам bootstrap(.., [Providers]) или компоненту, который должен быть корнем области, в которой должен использоваться общий экземпляр службы.

Также добавьте все зависимости (аргументы конструктора) в список поставщиков.

Если все настроено правильно, везде, где экземпляр запрашивается аргумент конструктора, экземпляр со всеми зависимостями автоматически решенных передается в.

Просто настроить DI и пусть он сделает всю работу за вас.

+0

Спасибо за помощь Gunter, но я ищу решение, в котором компонент не должен знать об услуге. – Sanjeev

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