BehaviorSubjectを持つコンポーネントでresponseの値を取得できません。私はそれを手に入れてそれを渡す。BehaviorSubject RxJs angular2
私はルートガードのサービスからHTTPをトリガーしています。
サービス:
@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();
}
);
});
}
コンポーネント:
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:それはちょうどHTTPのparams ...のクエリのparamをgetingだ
<div class="project" [hidden]="!showIntro" *ngFor="let project of projects>
{{project.title}}
</div>
ガード:
@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)
}
}
私もNgZone
を試みるが、私はわからないんだけど、それは正しい方法である:すべての
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));
}
何の問題、あなたを持っている?あなたは何のエラーを言及することができます。 –
'load()'はどこにありますか?なぜあなたは非常に多くのネストされたオブザーバを使用しますか? – Meir
エラーが表示されない...データをレンダリングしない...コンポーネントでHTTP応答を取得できない。 ルートガード(canActivate)でload()が正しく呼び出されました。 –