Ich versuche, Daten zwischen zwei Komponenten über einen Dienst zu senden. Ich habe jedoch Probleme mit dem Datenauffüllen, wenn die "untergeordnete" Komponente zuerst geladen wird.Senden von Daten zwischen Komponenten mit einem Dienst in Angular 2
Wenn Sie ein 'release' aus der ungeordneten Liste in der release-list.component auswählen, wird die release-detail.component über einen Router-outlet geladen. Die Release-Detail-Komponente sollte den Veröffentlichungskünstler anzeigen.
Es funktioniert, wenn Sie ein Release auswählen und dann ein Release ein zweites Mal auswählen. Aber ich muss die release-detail.component zweimal laden, bevor die Daten gefüllt sind. Ich fühle mich nahe, aber ich muss etwas verpassen. Jede Hilfe würde sehr geschätzt werden.
Dank
Ich habe beide bezogen auf eine previous question und die 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);
}
}
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;
});
}
}
Brilliant. Danke, Fredrik! Die RxJS-Konzepte sind für mich noch neu und ich hatte das Gefühl, dass ich dort ein bisschen abseits der Strecke wäre. Die einzige andere Sache, die ich ändern musste, war der ReleaseDetailComponent und ngOnInit Hook -> this.release = this._releaseService.getRelease(). Subscribe (release => { return this.release = release; }); – bmd
Fertig! Und danke nochmal – bmd
Gerne helfen! :) –