angular - Bileşende servis değişkenine erişilemiyor - Angular2
Bir serviste bir HTTP çağrısı yapıyorum ve dönen veriyi bir servis değişkenine atıyorum. Şimdi o servis değişkenine bir bileşende erişmeye çalıştığımda, konsolda undefined olarak görünüyor. Ancak log kodunu servisin kendisine koyduğumda loglanıyor ama bileşende çalışmıyor.
Aşağıda referans için kodum bulunmaktadır:
kahraman.servis
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { Hero } from './hero';
@Injectable()
export class HeroService {
heroes: Hero[];
hero: Hero;
gbl: Hero[];
private heroesUrl = 'SERVICE URL';
constructor (private http: Http) {}
getHeroes(): Observable<Hero[]> {
return this.http.get(this.heroesUrl)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json()['data'];
this.gbl = body;
return body || { };
}
private handleError (error: Response | any) {
Handles Error
}
getHero(id: number): Observable<Hero> {
return this.getHeroes()
.map(heroes => heroes.find(hero => hero.id == +id));
}
}
kahraman-listesi.bileşen
import { Component } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { HeroService } from './hero.service';
import { Hero } from './hero';
@Component({
template: `Template`
})
export class HeroListComponent {
errorMessage: string;
heroes: Hero[];
listlcl: Hero[];
id: number;
public listheroes: Hero[];
mode = 'Observable';
private selectedId: number;
constructor (
private heroService: HeroService,
private route: ActivatedRoute,
private router: Router
) {}
ngOnInit() { this.getHeroes() }
getHeroes() {
this.id = this.route.snapshot.params['id'];
console.log(this.id);
this.heroService.getHeroes()
.subscribe(
heroes => {
this.heroes = heroes;
this.listlcl = this.heroService.gbl;
console.log(this.listlcl);
},
error => this.errorMessage = <any>error);
}
isSelected(hero: Hero) { return hero.id === this.id; }
onSelect(hero: Hero) {
this.router.navigate(['/hero', hero.id]);
}
}
Cevap #1
Kodunuzdaki sorun, extractData'yi map içinde kullandığınızda this değişkeninin servisinizin örneği olmaması, HTTP isteğinin mapper'ına atanmasıdır.
Fonksiyonunuzu basitçe bir Ok fonksiyonuna dönüştürebilirsiniz, böylece kapsam aşağıdaki gibi servis örneğine ayarlanır ve değişkenin değerini artık doğru şekilde servis örneğine atanmış olan komponent içinde görebilirsiniz.
private extractData = (res: Response) => {
let body = res.json()['data'];
this.gbl = body;
return body || { };
}
Bu Plunker'a bak!!
Umarım bu yardımcı olur!!
TypeScript belgelerinden alınmış bazı referans,
bu ve ok fonksiyonları
JavaScript'te bu, bir fonksiyon çağrıldığında ayarlanan bir değişkendir. Bu onu çok güçlü ve esnek bir özellik yapar, ancak bir fonksiyonun hangi bağlamda çalıştığını her zaman bilme zorunluluğu maliyetiyle gelir. Özellikle bir fonksiyon döndürürken veya bir fonksiyonu argüman olarak geçirirken bu ünlü şekilde kafa karıştırıcıdır.
Bunu, fonksiyonu daha sonra kullanılmak üzere döndürmeden önce doğru this değeri ile bağlandığından emin olarak düzeltebiliriz. Bu şekilde, fonksiyon daha sonra nasıl kullanılırsa kullanılsın, orijinal deck nesnesini görebilecektir. Bunu yapmak için, fonksiyon ifadesini ECMAScript 6 ok (arrow) sözdizimini kullanacak şekilde değiştiririz. Ok fonksiyonları, fonksiyonun çağrıldığı yerde değil, oluşturulduğu yerdeki this değerini yakalar.
