2017-08-02 6 views
1

サービスを使用して角度コンポーネントから別の角度コンポーネントにデータを渡すことができません。ここではサービスコードは次のとおりです。角度サービスを使用する2つの角度4コンポーネント間でデータを渡すことができません。

ここ
import { Injectable } from '@angular/core'; 

@Injectable() 
export class DataService { 
    public serviceData: string; 
} 

がコンポーネントhomeです:

import {Component, OnInit, Input} from '@angular/core'; 
import {Router} from "@angular/router"; 
import { DataService } from '../common/common.service'; 

@Component({ 
    selector: 'app-home', 
    templateUrl: './home.component.html', 
    styleUrls: ['./home.component.css'] 
}) 
export class HomeComponent { 

    constructor(public router: Router, public commonService: DataService) { 
    this.commonService.serviceData = 'Message from Home Component to App Component!'; 
    this.router.navigate(["overview"]); 
    } 

} 

ここで概要コンポーネントです:

import {Component, OnInit, Input} from '@angular/core'; 
import { DataService } from '../common/common.service'; 
import { Subscription } from 'rxjs/Subscription'; 

@Component({ 
    selector: 'app-overview', 
    templateUrl: './overview.component.html', 
    styleUrls: ['./overview.component.css'] 
}) 
export class OverviewComponent { 
    constructor(public messageService: DataService) { 
    alert(this.messageService.serviceData); 
    } 
} 

OverviewComponentでアラートが常にundefinedを示しています。

+0

[ドキュメント]の例の束(https://stackoverflow.com/documentation/angular/10836/sharing-data-among-components#t=201708021351339613133)の – Nehal

+0

可能な重複があります[どのように共有しますサービスを正しく使用しているコンポーネント間のデータ?](https://stackoverflow.com/questions/40468172/how-to-share-data-between-components-using-a-service-properly) –

+0

サービスは、シングルトンは、クラスの単一インスタンスです。これはシングルトンなので、1セットのデータを保持して、コンポーネント間で共有することができます。サービスがシングルトンであることを保証するためには、1回のみ登録する必要があります。両方のコンポーネントの '[providers]'配列に追加することで、これを2回登録します。推奨される方法は、ここに示すようにApp Moduleに登録することです。https://blogs.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/ – DeborahK

答えて

2

コンポーネントレベルにDataServiceプロバイダを注入したので、そのインスタンスは現在のコンポーネントの子孫インジェクタツリーと共有されます。この場合、DataServiceのインスタンスはapp-home & app-overviewとなります。言い換えれば、角度はDataServiceの2つの異なるインスタンスを作成します。

共有型データプロバイダをルートモジュールprovidersメタデータオプションに登録すると、すべてのコンシューマが同じインスタンスにアクセスできるようにすることをお勧めします。コンポーネントレベルprovidersメタデータオプションからDataServiceを削除してください。

@NgModule({ 
    imports: [..], 
    declarations: [AppComponent, ...], 
    providers: [DataService, ...], //<- moved here 
    bootstrap: [AppComponent] 
}) 
export class AppModule { 

} 
+0

データを渡すことができません。定義されていないと表示されています – iJade

+0

上記の答えに従って、両方のコンポーネントから 'プロバイダ:[DataService]'を削除しましたか? –

+0

@DeanChalkはいコンポーネントの両方からプロバイダを削除しました – iJade

関連する問題