2

私の目標は、角度コンポーネントからサービスにデータを送信し、サービスメソッドを使用してそれを処理することです。例:角度2がコンポーネントからサービスにデータを送信

export class SomeComponent { 
    public data: Array<any> = MyData; 
    public constructor(private myService: MyService) { 
     this.myService.data = this.data; 
    } 
} 

とサービス:

@Injectable() 
export class TablePageService { 
    public data: Array<any>; 
    constructor() { 
     console.log(this.data); 
     // undefined 
    } 
} 

の取得データは不定です。どのように動作させるには?

+1

サービスコンストラクタは、コンポーネントにインジェクトした時点ですでに実行されています。初期化していないため、その時点では 'data'は定義されていません。 –

+0

オブジェクトのメソッドを呼び出す前に、そのオブジェクトを構築する必要があります。したがって、コンストラクタが呼び出され、データは未定義です。その後、メンバにアクセスして変数を変更しますが、コンストラクタはすでに呼び出されています。 – Akkusativobjekt

+0

どうすれば修正できますか? – TeodorKolev

答えて

3

サービスとコンポーネントとの間の相互作用があり得る場合の例:

サービス:

@Injectable() 
export class MyService { 
    myMethod$: Observable<any>; 
    private myMethodSubject = new Subject<any>(); 

    constructor() { 
     this.myMethod$ = this.myMethodSubject.asObservable(); 
    } 

    myMethod(data) { 
     console.log(data); // I have data! Let's return it so subscribers can use it! 
     // we can do stuff with data if we want 
     this.myMethodSubject.next(data); 
    } 
} 

コンポーネント1(送信者):

export class SomeComponent { 
    public data: Array<any> = MyData; 

    public constructor(private myService: MyService) { 
     this.myService.myMethod(this.data); 
    } 
} 

COMPONENT2(受信機)

export class SomeComponent2 { 
    public data: Array<any> = MyData; 

    public constructor(private myService: MyService) { 
     this.myService.myMethod$.subscribe((data) => { 
       this.data = data; // And he have data here too! 
      } 
     ); 
    } 
} 

説明:

MyServicedataを管理しています。必要ならばdataでまだやりとりをすることができますが、それはComponent2に任せておく方が良いです。基本的

MyServiceComponent1からdataを受け取り、方法myMethod()に加入している誰に送信します。

Component1dataMyServiceに送信しています。 Component2myMethod()に登録されていますので、myMethod()が呼び出されるたびにComponent2は返信し、myMethod()が返すものを取得します。

+0

ここで、コンポーネント2のMyDataはどこから来たのですか? – TeodorKolev

+1

私はあなたのコードから取り出しました: 'public data:Array = MyData;'。 'public data = {};'と宣言することもできます。たとえば、使用しているデータ型によって異なります。私はちょうどそれをあなたの例に近づけたかったので、あなたには分かりやすいでしょう。 – SrAxi

+0

2つのパラメータを設定できますか? 2つの別々の文字列を言いますか? 2つの科目と2つのオブザーバブルが必要ですか? – TeodorKolev

関連する問題