2016-11-03 12 views
2

ComponentのメソッドをServiceから呼び出しようとしています。これを行う適切な方法は何ですか? Observableを作成するのにrxjs Subjectを使用しようとしましたが、起動できません。Angular2がサービスからコンポーネントを呼び出す

import {Subject} from 'rxjs/Subject'; 
    export class MyService { 
     callComponent = function(value) { 

      let invokeEvent = new Subject(); 

      invokeEvent.next({some:value}) 
     } 
    } 

と私のコンポーネントで

export class MyComponent { 
    constructor(private _myService: MyService) { 
      this._myService.invokeEvent.subscribe(value => console.log(value)) 
      } 

} 
+0

私はあなたのサービスおよびオブジェクト 'this._myServiceの一時的な変数' invokeEvent'との間の関係を描くことができませんコンポーネントで使用している.invokeViewEvent'を呼び出します。 –

+0

申し訳ありませんがタイプミス。私が聞こうとしているのはinvokeEventです。 'callComponent'を呼び出すと、コンポーネントを起動させたいと思っています。私は観察可能なものについている。 – Rob

答えて

2

ここplunkerです:この

import {Subject} from 'rxjs/Subject'; 

@Injectable() 
export class MyService { 

    invokeEvent:Subject<any> = new Subject(); 


    callComponent(value) { 
     this.invokeEvent.next({some:value}) 
    } 
} 

は、あなたのコンポーネント

にそれを提供することを忘れてはいけないよう http://plnkr.co/edit/WKSurRJMXo5JZOPrwSP5?p=preview

は、あなたのサービスを変更

@Component({ 
    selector: 'my-component', 
    template: ` 
    `, 
    providers: [MyService] 
}) 
export class MyComponent { 
     constructor(private _myService: MyService) { 
     this._myService.invokeEvent.subscribe(value => console.log(value)); 
     setTimeout(()=>{ 
      this._myService.callComponent(1); 
     },1000); 
     } 
} 

また、このサービスをグローバル共有サービスにしたい場合は、それをあなたのブートストラップ(古い)またはngModuleに入れて(提供して)、アプリケーション全体で同じシングルトンインスタンスを共有します。

+0

いくつかの追加情報は、私がangle2 appの外でウィンドウにサービスメソッドを公開していることです。私が 'window.myangular.MyService.callComponent()'のように呼び出せるように、私は既にzone.runとdetechChanges()でラップしようとしました。このメソッドでは、コンソールからの呼び出しが成功していることがわかります。 – Rob

+0

@Rob私は答えをplunker先生に更新しました。私は以前のコメントを消しています。 – echonax

+1

それはそれをしました!問題は、それが 'Component''プロバイダ:[]'に 'MyService'を持っているようなものではないということでした。それはプライマリアプリケーションモジュールにのみ必要であった。私には奇妙だが、ありがとう。 – Rob

1

サービスでObservableを定義すると、Observableをコンポーネントから購読することができます。

//サービス

import { Injectable, Inject } from '@angular/core'; 
import { Subject } from 'rxjs/Subject'; 
@Injectable() 
export class MyService { 
    private notify = new Subject<any>(); 
    /** 
    * Observable string streams 
    */ 
    notifyObservable$ = this.notify.asObservable(); 

    constructor(){} 

    public notifyOther(data: any) { 
    if (data) { 
     this.notify.next(data); 
    } 
    } 

    callComponent(value){ 
    this.notify.next({some:value}); 
    } 
} 

//コンポーネント

import { Component, OnInit, OnDestroy } from '@angular/core'; 
import { Subscription } from 'rxjs/Subscription'; 

import { MyService } from './my.service'; 
export class MyComponent { 
    private subscription: Subscription; 
    constructor(private _myService: MyService){ 
    } 

    ngOnInit() { 
    this.subscription = this._myService.notifyObservable$.subscribe((value) => { 
     console.log(value); 
    }); 
    } 

    ngOnDestroy() { 
    this.subscription.unsubscribe(); 
    } 
} 
+0

これを動作させることはできません。私はこれと一致するように自分のコードを構造化し、まだ行っていない。 – Rob

0
import {Subject} from 'rxjs/Subject'; 

export class MyService { 

     private invokeEvent = new Subject(); 

     invokeEvent$ = this.missionConfirmedSource.asObservable(); //<<< this is important to declare invokeEvent with asObservable(); 

     callComponent = function(value) { 
      invokeEvent.next({some:value}) 
     } 
} 


export class MyComponent { 
    constructor(private _myService: MyService) { 
      this._myService 
       .invokeEvent$          //<<< subscribe to invokeEvent$ to get the result 
       .subscribe(value => console.log(value)) 
      } 

} 
関連する問題