我在Angular中遇到HTTP問題。 javascript
我只想GET
一個JSON
列表並將其顯示在視圖中。 java
import {Injectable} from "angular2/core"; import {Hall} from "./hall"; import {Http} from "angular2/http"; @Injectable() export class HallService { public http:Http; public static PATH:string = 'app/backend/' constructor(http:Http) { this.http=http; } getHalls() { return this.http.get(HallService.PATH + 'hall.json').map((res:Response) => res.json()); } }
在HallListComponent
我從服務中調用getHalls
方法: node
export class HallListComponent implements OnInit { public halls:Hall[]; public _selectedId:number; constructor(private _router:Router, private _routeParams:RouteParams, private _service:HallService) { this._selectedId = +_routeParams.get('id'); } ngOnInit() { this._service.getHalls().subscribe((halls:Hall[])=>{ this.halls=halls; }); } }
可是,我有一個例外: json
TypeError:this.http.get(...)。map不是[null]中的函數 angular2
import {Component} from "angular2/core"; import {RouterOutlet} from "angular2/router"; import {HallService} from "./hall.service"; import {RouteConfig} from "angular2/router"; import {HallListComponent} from "./hall-list.component"; import {HallDetailComponent} from "./hall-detail.component"; @Component({ template:` <h2>my app</h2> <router-outlet></router-outlet> `, directives: [RouterOutlet], providers: [HallService] }) @RouteConfig([ {path: '/', name: 'HallCenter', component:HallListComponent, useAsDefault:true}, {path: '/hall-list', name: 'HallList', component:HallListComponent} ]) export class HallCenterComponent{}
import {Component} from 'angular2/core'; import {ROUTER_DIRECTIVES} from "angular2/router"; import {RouteConfig} from "angular2/router"; import {HallCenterComponent} from "./hall/hall-center.component"; @Component({ selector: 'my-app', template: ` <h1>Examenopdracht Factory</h1> <a [routerLink]="['HallCenter']">Hall overview</a> <router-outlet></router-outlet> `, directives: [ROUTER_DIRECTIVES] }) @RouteConfig([ {path: '/hall-center/...', name:'HallCenter',component:HallCenterComponent,useAsDefault:true} ]) export class AppComponent { }
{ "compilerOptions": { "target": "ES5", "module": "system", "moduleResolution": "node", "sourceMap": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "removeComments": false, "noImplicitAny": false }, "exclude": [ "node_modules" ] }
我認爲您須要導入如下內容: app
import 'rxjs/add/operator/map'
或更籠統地說,若是您想擁有更多可觀察的方法。 警告:這將導入全部50多個運算符,並將它們添加到您的應用程序中,從而影響捆綁包的大小和加載時間。 ide
import 'rxjs/Rx';
有關更多詳細信息,請參見此問題 。 函數
直接使用Observable.subscribe
應該能夠。 this
@Injectable() export class HallService { public http:Http; public static PATH:string = 'app/backend/' constructor(http:Http) { this.http=http; } getHalls() { // ########### No map return this.http.get(HallService.PATH + 'hall.json'); } } export class HallListComponent implements OnInit { public halls:Hall[]; / *** / ngOnInit() { this._service.getHalls() .subscribe(halls => this.halls = halls.json()); // <<-- } }
只是一些背景...新建立的Server Communication開發指南(最後)討論/說起/解釋瞭如下內容: spa
RxJS庫很大。 當咱們構建生產應用程序並將其部署到移動設備時,大小很重要。 咱們應該只包括咱們實際須要的那些功能。
所以,Angular在
rxjs/Observable
模塊中公開了Observable
的精簡版本,該版本幾乎缺乏全部運算符,包括咱們想在此處使用的運算符,例如map
方法。由咱們決定添加所需的運算符。 咱們能夠一個接一個地添加每一個運算符,直到咱們有一個精確地調整到咱們要求的自定義Observable實現。
所以,正如@Thierry已經回答的那樣,咱們只需引入所需的運算符便可:
import 'rxjs/add/operator/map'; import 'rxjs/operator/delay'; import 'rxjs/operator/mergeMap'; import 'rxjs/operator/switchMap';
或者,若是咱們很懶,咱們能夠引入全套運算符。 警告:這會將全部50多個運算符添加到您的應用包中,而且會影響加載時間
import 'rxjs/Rx';
因爲angular2中的 Http服務返回的是Observable類型,所以從您的Angular2安裝目錄(本例中爲'node_modules'),咱們須要使用http服務將Observable的map函數導入到您的組件中 ,以下所示:
import 'rxjs/add/operator/map';
您在此處使用的地圖不是javascript中的.map()
,而是Rxjs地圖函數, Observables
在Angular中使用Observables
。
所以,在這種狀況下,若是您想在結果數據上使用map,則須要將其導入...
map(project: function(value: T, index: number): R, thisArg: any): Observable<R>
將給定的項目函數應用於源Observable發出的每一個值,並將結果值做爲Observable發出。
所以,只需像這樣導入:
import 'rxjs/add/operator/map';