J'essaie de mettre en œuvre une communication de service-composant en mode angulaire, lorsque le service contient une valeur et que le composant s'y abonne. J'utilise Abonnement rxjs, mais je reçoisAngular + rxjs: Aucun fournisseur d'abonnement
Uncaught (in promise): Error: No provider for Subscription!
Voici ce que je fais dans un service:
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class PracticeContextService {
practice: Subject<any> = new Subject<any>();
public practiceSelected$ = this.practice.asObservable();
setPractice(providerId: string) {
this.practice.next({ providerId: providerId });
}
getPractice(): Observable<any> {
return this.practice.asObservable();
}
}
et dans le composant:
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs/Subscription';
import { PracticeContextService } from '../practice-context.service';
@Component({
selector : 'practice-context-selector',
templateUrl : './practice-context-selector.component.html',
styleUrls : ['./practice-context-selector.component.css']
})
export class PracticeContextSelectorComponent implements OnInit, OnDestroy {
practice: string;
constructor(private context: PracticeContextService,
private subscription: Subscription) {}
ngOnInit() {
this.subscription = this.context.practiceSelected$.subscribe(
practice => {
this.practice = practice;
});
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
Component et le service sont regroupés dans le module, qui est ensuite injecté dans un autre module.
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PracticeContextSelectorComponent } from './practice-context-selector/practice-context-selector.component';
import { PracticeContextService } from './practice-context.service';
@NgModule({
imports : [
CommonModule
],
declarations : [
PracticeContextSelectorComponent
],
providers : [
PracticeContextService,
],
exports: [
PracticeContextSelectorComponent
]
})
export class PracticeContextModule {}
Apparemment, je fais quelque chose de mal ici
Si vous avez un paramètre constructeur dans une classe instanciée par angulaires DI, alors il doit y avoir une fournisseur correspondant. Quel est le but de ce paramètre dans 'constructeur (contexte privé: PracticeContextService, abonnement privé: Abonnement)'? –
L'abonnement n'est pas pour DI, importez-le comme 'import {Subscription} de 'rxjs/Subscription';'. –
@ lyubimov-roman Je suis en train de faire cette importation dans un composant. Si je ne dois pas câbler cette dépendance à un composant dans le constructeur, quelle est la bonne façon d'utiliser? Je demande parce que j'ai trouvé une poignée d'exemples en utilisant cette approche, mais cela ne semble pas fonctionner pour moi. – vitalym