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));
}
}
美しい!今は完璧に動作します。また、そのポストに感謝します。だから、あなたはSubject over BehaviorSubjectをいつ選択しますか?後者のように、コンポーネントの周りにデータを渡すときに行く方法です。 – ZeroDarkThirty
すばらしい、私はあなたを助けることができてうれしい!サブスクリプションの時点からソースが発行した値だけに興味がある場合は、サブジェクトを使用します。サブスクリプションの前に(あなたの場合のように)放出された最後の値が必要な場合は、BehaviourSubjectを使用してください。 – David