2017-10-13 23 views
1

私にはSharedDataService(SDS)とFilterService(FS)という2つのサービスがあります。 SDSは私のAPIを扱います。それは私のユーザー、従業員、観測を買い物に行く。また、バックエンドに送信するものも処理します。 FSは大量に処理しますが、画面上で発生するすべてのものを処理するわけではありません。私のインタラクションサービスでは、もし私が(仕事がうまくいくなら)自分のリストを、入力された日付、従業員、いくつかのカテゴリ、または一緒に結合されたすべての人によってフィルタリングすることができます。サービス間の角4通信

ここに私の問題があります。お互いに話す二つのサービスをどのようにして得ますか?私は、SDS(ユーザーと観察)から来るFSのいくつかの情報が必要です。どのように話すようにするのですか?

私が試してみた:

//SharedDataService.ts 
    public observations: Observation[] = []; 
    private observationsSource = new BehaviorSubject<any>(this.observations); 
    observations$ = this.observationsSource.asObservable(); 

    public getObservations(jobcode: string, loc_name: string): 
    Observable<Observation[]> { 
     return this.http 
     .get(API_URL + '/quick-interactions/get-observations/' + jobcode + '/' + loc_name) 
     .map(response => { 
     this.observations = response.json(); 
     this.observations.map((observation) => new Observation(observation)); 
     return this.observationsSource.next(this.observations); 
     }) 
     .catch(this.handleError); 
    } 

    //FilterService 
    constructor(
     private sharedDataService: SharedDataServiceService 
    ) { 
     sharedDataService.employee$.subscribe(employee => { 
      this.employee = employee; 
     }); 

     sharedDataService.observations$.subscribe(observations => { 
      this.observations = observations; 
     }); 
    } 
をしかし、それは私が必要なものを私に取得していません。私はBehaviorSubjectの代わりにObservableとして試しました。私はthis.observationsを返すshareObservationsメソッドへの単なる呼び出しとして試してみました。彼らの誰も働いていない。

誰もが明るいアイデアを持っていますか?

+1

あなたはそうではありません行動主題が必要です。上記のコードでは、依存関係注入を使用して別のサービスにアクセスできるはずです。どのように動作していないのか詳しく説明できますか? – DeborahK

+0

私は質問のために削除したconsole.logsのトンを持っています。アプリケーションが読み込まれると、SDSが292の観測値を取得したことがわかりますが、FSではconsole.logsに "null"と表示されます。したがって、SDSは観測を受けていますが、彼らはFSと共有されていません。 SDSが買物を終える前にFSが稼動していると思われますが、観測可能なものであってもデータがFSに到達することはありません。 –

+0

サービスコードスニペットをさらに教えてください。ところで、サービスクラスの直前に '@Injectable()'を配置しましたか? – asmmahmud

答えて

0

あなたは(BehaviorSubjectなしで今)このように見えるようにコードを変更した場合:

this.sharedDataService.getObservations.subscribe(observations => { 
     this.observations = observations; 
     console.log(this.observations); 
    }); 

にconsole.log 内のサブスクライブ、それは未定義の出力しますか?このようなので、何か、私は完全にし、代わりにコンポーネントからBehaviorSubjectをスキップFilterServiceでメソッドを呼び出します

public getObservations(jobcode: string, loc_name: string): 
Observable<Observation[]> { 
    return this.http 
    .get(API_URL + '/quick-interactions/get-observations/' + jobcode + '/' + loc_name) 
    .map(response => <Observation[]>response.json()) 
    .do(data => console.log(JSON.stringify(data)) 
    .catch(this.handleError); 
} 
+0

空の配列を出力します。 –

+0

上記の私の答えに示されているように、あなたは余分なbehaviorSubjectのすべてを取り除くとどうなりますか?それはディスプレイを変えますか? – DeborahK

+0

はまだFSの中に空の配列を与えていますが、現在は私のコンソールは文字列化されたすべての観測でうんざりしています。 –

1

SharedDataServiceでメソッドを呼び出します:

ここ

は簡易版でSDSをあります

コンポーネント:

constructor(private filterService: FilterService) { } 

ngOnInit() { 
    this.filterService.getMyData(jobcode: string, loc_name: string) 
    .subscribe(data => { 
     console.log(data); 
    }) 
} 

FilterService:

constructor(private sharedDataService: SharedDataService) { } 

getMyData(jobcode: string, loc_name: string) { 
    this.sharedDataService.getObservations(jobcode: string, loc_name: string) 
    .map(data => { 
     // do whatever you need to do with your data here, then return 
     return data; 
    }) 
} 

、その後、最終的にはAPIからデータを取得しSharedDataService

constructor(private http: Http) { } 

getObservations(jobcode: string, loc_name: string) { 
    return this.http.get('url here') 
    .map(response => response.json().map(res => new Observation(res)))) 
} 

は、ここではいくつかの異なる変数名などとDEMOですが、ありません同じもの:)

関連する問題