2017-02-20 2 views
0

У меня есть служба, которая указана только в качестве поставщика в моем модуле appModule. Это не в списке поставщиков в другом месте моего приложения. Любое свойство, которое я устанавливаю внутри моей службы, всегда не определено, когда я перемещаюсь от компонента, где он используется, и возвращайтесь. Вот моя служба ...Угловые 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 НЕ вызывается снова, но свойство lookups всегда не определено.

ответ

3

Заменить

.map(this.extractData); 

по

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

В противном случае, this не привязан к текущему объекту больше.

IMHO, вызывающий map() не должен иметь побочных эффектов. Так что я бы реорганизовать код

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

Это ясно показывает, что вы

  • преобразования ответа HTTP на что-то другое
  • добавить побочный эффект того, чтобы хранить поиски в области Lookups
+0

Спасибо, это было именно оно. Я знал, что это должно быть что-то глупое, которого я пропустил. Я полностью потерял свою привязанность. –

Смежные вопросы