2017-06-23 17 views
0

私は角度コンポーネントで観測可能なRxjsと学習しています。私はいくつかのイベントに基づいてコンポーネントからサービスにデータを渡す必要があるシナリオを持っています。サービス上Observable in Service Angleのサブスクリプションが動作していません

Price.service.ts

export class PriceService{ 
    private priceUpdate: BehaviorSubject<Object> = new BehaviorSubject({}); 
    private oldPriceUpdate: BehaviorSubject<Object> = new BehaviorSubject({}); 
    getPriceUpdate(){ 
     return this.priceUpdate.asObservable(); 
    } 
    getOldPrice(){ 
     return this.oldPriceUpdate.asObservable(); 
    } 
} 

価格更新を取得するためのコンポーネントで使用されています。

Price.component.ts

@Component({ 
    selector: 'price', 
    templateUrl: 'price.component.html', 
    styleUrls: ['price.component.css'] 
}) 
export class PriceComponent{ 
    updateIndicator: BehaviorSubject<Object> = new BehaviorSubject({}); 
    constructor(private priceService:PriceService, private techIndicator:TechnicalIndicatorService){ 
    this.techIndicator.subscribeUpdateIndicator(this.updateIndicator.asObservable()); 
    this.priceService.getPriceUpdate().subscribe(
     (newPrice:any) => { 
     this.updatePrice(newPrice); 
     } 
    ) 
    this.priceService.getOldPriceUpdate().subscribe(
    (oldPrice:any) => { 
     //some business logic 
     this.updateIndicator.next({{data: data, ....}); 
    }); 
    } 
    private updatePrice(newPrice:any){ 
    //.... some business logic.... 
     this.updateIndicator.next({data: data, ....}); 
    } 
} 

コンポーネントにPriceServiceから新価格を取得した後、私はいくつかの技術的な研究をやっている他のサービスを提供しています。私はサービスにデータを渡す必要があります。そのために、私はコンポーネントの動作の件名を使用しており、サービスはそれを購読しています。 (コンポーネントが購読している通常の方法とは異なります)

私はその観測方法を有効に使う方法を教えてください。

TechnicalIndicator.service.ts

export class TechnicalIndicatorService{ 
    subscribeUpdateIndicator(updateIndicator:Observable<Object>){ 
    updateIndicator.subscribe(
     (obj:any) => { 
      // some logic 
     }); 
    } 
} 

サブスクリプションがTechnicalIndicatorServiceに一度だけ働いているが。その後のデータ更新では、そのサブスクリプションがトリガーされません。 ここで私が紛失していることを教えてください。

+1

なぜあなたはあなたのサービスに観測物を渡しますか?インジケータを更新する必要があるたびに、サービスのメソッドを直接呼び出してみませんか?通常、コンポーネントのインスタンスがいくつかあります。TradeComponentが作成されるたびに、新しいオブザーバブルが作成され、それがサービスに渡されます。 –

+0

コンポーネントの '@ Component'アノテーションを含めることができますか? – echonax

+0

編集したコードをご覧ください。コンポーネントクラスの2つのサブスクリプション、priceUpdate&oldPriceUpdateがあります。どちらもデータをサービスに渡し、サービスではデータが同期している必要があります(私が配列を更新するために使用しています)。いくつかのケースでは、物事が期待どおりに機能していなかった。メソッドを直接呼び出す代わりに、オブザーバブルを使用してデータを渡すことを考えました。 –

答えて

0

件名が多すぎます。あなたはそれらを防ぐことができ、簡単にすることができます。

投稿した内容TechnicalIndicatorServicepriceUpdateまたはoldPriceUpdateのいずれかの変更を通知したいと思います。


解決策1:このため

あなたはすべてのコンポーネントに来る必要がいけません。あなたはこれを行うことができます。直接TechnicalIndicatorServicePriceServiceを注入してください。

TechnicalIndicatorService:

export class TechnicalIndicatorService{ 
    constructor(private priceService: PriceService){ 
     priceService.getPriceUpdate().subscribe(this.doSomething); 
     priceService.getOldPrice().subscribe(this.doSomething); 
    } 
    private doSomething(update){ 
    } 
} 

あなたはコンポーネントには何も記述する必要がいけません。


解決方法2:

しかし、あなたは彼らが互いを認識し、コンポーネントからだけやりたいしたくない、あなたはこれを行うことができます。

PriceComponent

export class PriceComponent{ constructor( private priceService:PriceService, private techIndicator:TechnicalIndicatorService ){ this.techIndicator.subscribeUpdateIndicator( return Observable.merge( priceService.getPriceUpdate(), priceService.getOldPrice() ); ); } } 

あなたがまだ被験者を使用したいのであれば、私は彼らがなぜf寄生虫。

関連する問題