typescript - Angular 2-prenumeration fungerar inte


Jag har följande problem med Angular 2 just nu.

Min tjänst fungerar korrekt, jag har lagt till console.log() i min tjänst för att kontrollera att den hämtar data, vilket den gör. Min tjänst ser ut så här:

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/from';
import 'rxjs/add/operator/map';

@Injectable()
export class Service {
  location: string;

  constructor(private http: Http) {}

  getCurrentLocation(): Observable<string> {
  return this.http.get('service-method-here')
   .map((result: Response) => result.json())
     .map((data: any) => {
       let location: string = '';
       if(data) {
         console.log(data.description);
         location = data.description;
       }
       return this.location;
      });
  }
}

Inuti min komponent kallar jag dock tjänsten så här. Den anropar min tjänst eftersom console.log() som jag hade placerat inuti metoden visas korrekt i konsolen. Så här kallar jag tjänsten inuti min komponent:

import { Component, OnInit } from '@angular/core';
import { FORM_DIRECTIVES } from '@angular/common';
import { Component } from '...';
import { Service } from '...';

@Component({
  selector: 'selector',
  templateUrl: '...',
  styleUrls: ...,
  directives: [FORM_DIRECTIVES, Component]
})
  export class Component implements OnInit {
  public locationName: string;
  constructor(public service: Service) {

  }

  ngOnInit() {
    this.service.getCurrentLocation()
      .subscribe(data => {
              console.log(data);
              this.locationName = data
            },
            error => {
              console.log('error');
            });
}

Koden console.log() inuti komponenten returnerar undefined. HTML:en på min sida för fullständighetens skull ser ut så här:

<h4>{{locationName}}</h4>

Svar #1

I din tjänst den här raden

location = data.description;

borde vara

this.location = data.description;

annars returneras en annan plats än den som angavs

@Injectable()
export class Service {
  location: string;

  constructor(private http: Http) {}

  getCurrentLocation(): Observable<string> {
  return this.http.get('service-method-here')
   .map((result: Response) => result.json())
     .map((data: any) => {
       let location: string = '';
       if(data) {
         console.log(data.description);
         this.location = data.description; // <== 
       }
       return this.location;
      });
  }
}

Svar #2

Det finns två platser 1) lokal let location... 2) och komponenter this.location

.map((data: any) => {
   //let location: string = '';
   if(data) {
     console.log(data.description);
     // we should assign the components property, not the 
     // local variable
     //location = data.description;
     this.location = data.description;
   }
   // this is returned
   return this.location;
  });

Och eftersom komponenterna inte är initierade alls

export class Component implements OnInit {
public locationName: string;
...

vi får odefinierad