Я нашел пример из angular.io. Этот пример очень похож на мое приложение с такими же методами. В этом примере используется Promises, но я использую Observables. Если я использую этот пример в качестве ссылки, у меня есть каждый метод, работающий в моем приложении, за исключением метода getHero в службе и ngOnInit в HeroDetailComponent. Поэтому мне интересно, может ли кто-нибудь помочь и преобразовать этот метод в наблюдаемый, потому что у меня возникают проблемы с синтаксисом. Вот коды мне нужно, преобразованные в Observable и plunkerHTTP: Angular 2 + TS Как использовать Observables в HTTP
//HeroService
getHero(id: number) { // my id is String
return this.getHeroes()
.then(heroes => heroes.filter(hero => hero.id === id)[0]);
}
//HeroDetailComponent
ngOnInit() {
if (this.routeParams.get('id') !== null) {
let id = +this.routeParams.get('id');
this.navigated = true;
this.heroService.getHero(id)
.then(hero => this.hero = hero);
} else {
this.navigated = false;
this.hero = new Hero();
}
}
Так что я хочу что-то вроде этого:
//HeroService
public getHero(id: string) {
return this.getHeroes()
.subscribe(heroes => this.heroes.filter(hero => heroes.id === id)[0]); //BTW, what does this [0] mean??
}
EDIT: Я был на самом деле получить список непосредственно, он не работал с return this.heroes, как это предложено в ответах ниже. Рабочий пример:
public getById(id: string) {
//return this.getHeroes() <---- didn't work
return this.http.get('someUrl') // WORKS!
.map(heroes => this.heroes.filter(hero => hero.id === id)[0]);
}
Теперь у меня все еще возникают проблемы с моим ngOnit, и я не могу понять почему!
ngOnInit(){
let id = this._routeParams.get('id');
this.heroService.getById(id)
//console.log("retrieved id: ",id) <----- gives correct id!
.subscribe(hero => this.hero = hero);
//console.log("hero: ", this.hero); <----- gives undefined!
}
EDIT2, по-прежнему получать неопределенными при попытке перейти на страницу подробно :(Я думаю, что у вас один кронштейн много в своем ответе, попытался посмотреть и получить правильные места для скобок?
ngOnInit(){
let id = this._routeParams.get('id');
this.heroService.getById(id)
.subscribe(heroes => {
// this code is executed when the response from the server arrives
this.hero = hero
});
// code here is executed before code from the server arrives
// even though it is written below
}
СПАСИБО! GetHero работает как шарм, но теперь у меня есть ошибка (wierd?) В моем ngOnInit. Вы можете помочь? Обновлен мой вопрос! – Alex
Я обновил свой ответ. –
Очень хорошее объяснение, спасибо! Я новичок в кодировании в целом, и я помню, что я натолкнулся на это где-то, где это одно из различий между обещаниями и наблюдаемыми. Но, наверное, я забыл об этом! Обновленный вопрос снова, потому что страница детали, к которой я перехожу, по-прежнему жалуется на то, что она не определена! Наверное, у вас слишком много одной скобки или слишком мало, я попытался поместить скобки в правильные места, но я думаю, что это все еще неправильно? – Alex