私は Angular2 の初心者で、Observables について助けが必要です。
リモートリソースからデータを取得してユーザーに表示するWebアプリがあります。
問題は、http を使用してデータを取得し、それをローカルに保存してから、他のコンポーネントで使用する必要があることです。
次のスキームを試しました:
data.ts
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class Airports {
private airportsUrl: string;
private cities: any;
private countries: any;
private routes: any;
private rawData: Observable<any>;
private errorMessage: any;
constructor(private http: Http) {
this.airportsUrl = '';
}
public get Cities() {
this.serverData.publishLast().refCount().subscribe(
data => this.cities = JSON.stringify(data)
);
return this.cities;
}
public get Countries() {
this.serverData.publishLast().refCount().subscribe(
data => this.countries = JSON.stringify(data)
);
return this.countries;
}
public get Routes() {
this.serverData.publishLast().refCount().subscribe(
data => this.routes = JSON.stringify(data)
);
return this.routes;
}
private init() {
this.serverData
.subscribe(
data => this.rawData = data,
error => this.errorMessage = <any> error
);
}
private get serverData() {
return this.http
.get(this.airportsUrl)
.map(this.parseData)
.catch(this.handleError);
}
private parseData(res: Response) {
let body = res.json();
return body;
}
private handleError (error: any) {
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
return Observable.throw(errMsg);
}
}
controller.ts
import '../../../public/css/styles.css';
import { Component, OnInit } from '@angular/core';
import { Airports } from './../data/data';
@Component({
providers: [Airports],
selector: 'destination-selector',
styleUrls: ['./../views/view.cityselector.css'],
templateUrl: './../views/view.cityselector.html',
})
export class CitySelector implements OnInit {
private cities: any;
private countries: any;
private routes: any;
constructor(private airports: Airports) { }
public ngOnInit() {
this.cities = this.airports.Cities;
this.countries = this.airports.Countries;
this.routes = this.airports.Routes;
}
}
view.cityselector.html
<main>
<div>Cities: {{ cities }}</div>
<div>Countries: {{ countries }}</div>
<div>Routes: {{ routes }}</div>
</main>
しかし、このスキームでは http を 3 回 (代わりに 1 回) 呼び出しますが、この値{{ cities }}
は未定義です。
したがって、http からデータを取得し、ローカル変数に保存し、その後ローカル データを使用して、常に新しい http を呼び出す方法