我試圖使用服務在兩個組件之間發送數據。但是,我在第一次加載'child'組件時遇到數據填充問題。使用Angular 2中的服務在組件之間發送數據
當您從release-list.component上的無序列表中選擇'release'時,它將通過router-outlet加載release-detail.component。 release-detail.component應該顯示發佈者。
如果您選擇一個版本,然後再次選擇一個版本,它會起作用。但是在填充數據之前,我必須兩次「加載」release-detail.component。我覺得我很接近,但我必須錯過一些東西。任何幫助將不勝感激。
感謝
我已經提到既是previous question和Angular documentation
release.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { MockReleaseList, ReleaseInterface } from './mock-releases';
@Injectable()
export class ReleaseService {
private releaseSubject$ = new Subject();
getReleases(): ReleaseInterface[] {
return MockReleaseList;
}
getRelease() {
return this.releaseSubject$;
}
updateRelease(release: {artist: string, title: string, category: string}[]) {
// console.log(release);
this.releaseSubject$.next(release);
}
}
釋放list.component.ts
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Location } from '@angular/common';
import { ReleaseService } from '../../../shared/services/release.service';
import { MockReleaseList, ReleaseInterface } from '../../../shared/services/mock-releases';
@Component({
selector: 'ostgut-releases',
template: `
<h3>Label List</h3>
<ul>
<li *ngFor="let release of releases" (click)="onSelect(release)">{{ release.artist }}</li>
</ul>
<router-outlet></router-outlet>
`,
})
export class ReleaseListComponent implements OnInit {
private releases: ReleaseInterface[];
constructor (
private _router: Router,
private _releaseService: ReleaseService
) {}
ngOnInit(): ReleaseInterface[] {
return this.releases = this._releaseService.getReleases();
}
onSelect(release: any): void {
this._releaseService.updateRelease(release);
this._router.navigate(['/release-list/release-detail', release.category]);
}
}
release-detail.component.ts
import { Component, OnInit, Input } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { ReleaseService } from '../../../../shared/services/release.service';
import { ReleaseInterface } from '../../../../shared/services/mock-releases';
@Component({
selector: 'ostgut-release-detail',
template: `
<h3>Release Detail</h3>
<p>{{ release.artist }}</p>
`,
})
export class ReleaseDetailComponent implements OnInit {
private routeParam: string;
private routeParamSub: any;
private release: any;
constructor(
private _activatedRoute: ActivatedRoute,
private _router: Router,
private _releaseService: ReleaseService
) {}
ngOnInit(): void {
this.release = this._releaseService.getRelease().subscribe(release=>{
return this.release = release;
});
}
}
輝煌。謝謝,Fredrik! RxJS的概念對我來說還是新的,所以我有一種感覺,那就是我會偏離軌道。我唯一需要改變的是在ReleaseDetailComponent和ngOnInit鉤子 - > this.release = this._releaseService.getRelease()。subscribe(release => { return this.release = release; }); – bmd
完成!並再次感謝 – bmd
樂意幫忙! :) –