Ich bekomme nicht den Wert der Antwort in einer Komponente mit BehaviorSubject. Ich habe es und gebe es im Dienst.BehaviorSubject RxJs angular2
Ich trigger HTTP aus Service auf Route Guard.
Service:
@Injectable()
export class ProjectsService {
projects: Subject<Project[]> = new BehaviorSubject<Project[]>([]);
load(clientId: string, active: boolean): Observable<boolean> {
return new Observable<boolean>((obs) => {
this._api.send(active ? 'projects.getActive' : 'projects.getAll',clientId).subscribe(
res => {
let temp = [];
res.forEach(a => temp.push(new Project(a)));
if (active) this.projects.next(temp);
else this.externalProjects.next(temp);
obs.next(true);
obs.complete();
},
err => {
obs.next(false);
obs.complete();
}
);
});
}
Komponente:
ngOnInit(): void {
// todo: check why not to load already added
this._projectsListener = this._projectsService.projects.subscribe(a => {
this.showIntro = a.length ? false : true;
this.projects = a;
});
}
HTML:
<div class="project" [hidden]="!showIntro" *ngFor="let project of projects>
{{project.title}}
</div>
Es ist nur Abfrage param Geting für HTTP params ... Wache:
@Injectable()
export class ProjectsGuard implements CanActivate {
constructor(
private _projectsService: ProjectsService,
private _router: Router) {}
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this._projectsService.load(next.params['id'], true)
}
}
Ich versuche auch, ein NgZone
aber ich bin nicht sicher, dass es ein richtiger Weg:
load(clientId: string, active: boolean): Observable<boolean> {
return this._api.send(active ? 'projects.getActive' : 'projects.getAll',clientId)
.map(res => {
let temp = res.map(a => new Project(a));
this._ngZone.run(() => {
console.log('temp: ', temp);
if (active) this.projects.next(temp);
else this.externalProjects.next(temp);
});
return true;
})
.catch(() => Observable.of(false));
}
Welche Frage Sie bekam? Sie können erwähnen, welchen Fehler Sie bekommen. –
Wo wird 'load()' aufgerufen? Warum benutzt du so viele verschachtelte Observable? – Meir
Ich bekomme keinen Fehler ... einfach nur keine Daten gerendert ... kann HTTP-Antwort in einer Komponente nicht erhalten. load() wird beim Routenschutz (canActivate) ordnungsgemäß aufgerufen. –