2017-09-09 6 views
0

Subjectと共有サービスを使用して、コンポーネント間でデータを転送しようとしています。しかし、それは動作していません。RxJS Subject/Shared Serviceを使用してコンポーネント間でデータを渡すことができません

私が代わりにコンポーネントデコレータのモジュールレベルでサービスを記載されていることに注意してください。また、これらの2つのコンポーネントが親子関係を共有していないことに気づく価値はあります。

マイサービス(SearchService):

import { Subject } from 'rxjs/Subject'; 

@Injectable() 
export class SearchService { 
    public messageSource = new Subject<any>(); 

    constructor() { } 

    topAlbums(album){ 
    this.messageSource.next(album); 
    } 

} 

コンポーネント1(それはデータを送信しています)。 createList()がトリガされると、新しいルートに完全にナビゲートされますが、(コンポーネント2の)下のサブスクライブしているメッセージは表示されません。

import { SearchService } from '../../services/search.service'; 

    export class AlbumComponent implements OnInit { 
    private UNIQUE_ID: string; 
    constructor(private _service: SearchService, private _http: Http, private router: Router) { } 

    //Linked to a click event handler 
    createList(){ 
     //API Call to retrieve an ID 
     this._http.post('https://api.url', data) 
      .map(res => res.json()) 
      .subscribe(item => { 
       this.ID = item.id; 
       let parsed_JSON = JSON.parse(item.files.myAlbums.content); 
       this.router.navigate(['/list', this.UNIQUE_ID]); 
      }) 
     this._service.topAlbums("Testing out by sending a dummy message"); 

} 

コンポーネント2(データの受信):

import { SearchService } from '../../services/search.service'; 

    export class ListComponent implements OnInit { 
    constructor(private _service: SearchService) { } 
    ngOnInit(){ 
     this._service.messageSource.subscribe(data => console.log(data)); 
    }   
} 

答えて

2

私はあなたがnext()を使用して値を放出さした後、あなたのListComponentSubjectに加入されているので、それが起こると思います。代わりにBehaviorSubjectを使用してください。 BehaviorSubjectにサブスクライブすると、最後の値が出力されます。それはまた、初期値を持つ必要があることであるので:

let bSubject = new BehaviorSubject(null); 

bSubject.next(album); 

bSubject 
.filter(value => value !== null) // filter out the initial null value to avoid problems if you did not emit anything before subscribing 
.subscribe((value) => { 
    console.log(value); // logs your album 
} 

Hereはまさにそのトピックに大きな柱があります。

+0

美しい!今は完璧に動作します。また、そのポストに感謝します。だから、あなたはSubject over BehaviorSubjectをいつ選択しますか?後者のように、コンポーネントの周りにデータを渡すときに行く方法です。 – ZeroDarkThirty

+0

すばらしい、私はあなたを助けることができてうれしい!サブスクリプションの時点からソースが発行した値だけに興味がある場合は、サブジェクトを使用します。サブスクリプションの前に(あなたの場合のように)放出された最後の値が必要な場合は、BehaviourSubjectを使用してください。 – David

関連する問題