2017-02-20 53 views
0

我有一個服務僅在我的appModule中被列爲提供者。它不在我應用程序中的任何其他地方的提供程序列表中。我在服務中設置的任何屬性始終未定義,只要我離開使用該組件的位置並返回。這是我的服務...Angular 2:Singleton Services - 屬性沒有記住?

LookupsService.ts

import {Injectable, OnInit} from '@angular/core'; 
import {Observable} from 'rxjs/Observable'; 
import {Http, Response} from "@angular/http"; 
import {environment} from "../environments/environment"; 
import {Lookups} from "./lookups.model"; 

@Injectable() 
export class LookupService { 
    private baseUrl: string; 
    private lookups: Lookups; 

    constructor(private http: Http) { 
    this.baseUrl = `${environment.epiApiUrl}/lookups`; 
    } 

    getAll(): Observable<Lookups> { 
    // we should only hit the database to get all the lookups once 
    if (this.lookups) { // <-- this.lookups is ALWAYS undefined 
     return Observable.of(this.lookups); 
    } 
    else { 
     return this.http.get(`${this.baseUrl}`) 
     .map(this.extractData); 
    } 
    } 

    extractData(response: Response) { 
    let responseBody = response.json(); 
    this.lookups = <Lookups>responseBody.data; // <--why isn't this remembered? 
    return this.lookups; 
    } 
} 

我目前唯一一個組件中使用該服務...

@Component({ 
    selector: 'addresses', 
    templateUrl: './addresses.component.html', 
    styleUrls: ['./addresses.component.less'] 
}) 
export class AddressesComponent implements OnInit { 
    @Input() user; 
    addressTypes: IdValue[] = []; 

    constructor(private lookupService: LookupService) { } 

    ngOnInit() { 
    this.lookupService.getAll() 
     .subscribe((lookups) => { 
     this.addressTypes = lookups.addressTypes; 
     }); 
    } 

} 

每當我更改爲不同的路線,回來,服務每次都必須從api請求查找,因爲this.lookups總是未定義的。 LookupsService構造函數不會再被調用,但查找屬性總是未定義的。

回答

3

通過

.map(response => this.extractData(response)); 

否則更換

.map(this.extractData); 

this沒有被綁定到當前對象了。

恕我直言,稱map()應該不會有副作用。所以,我的代碼重構

return this.http.get(`${this.baseUrl}`) 
    .map(response => response.json().data) 
    .do(lookups => this.lookups = <Lookups>lookups); 

這清楚地表明,你

  • 轉換到別的
  • 添加存儲在查找字段中查找的副作用的HTTP響應
+0

謝謝,這正是它。我知道這一定是我錯過的一些愚蠢的東西。我完全失去了我的這種約束力。 –