【发布时间】:2017-01-10 20:07:23
【问题描述】:
我有一个组件向我的服务请求 Observable 对象(即底层的 http.get 返回一个对象)。
对象(一个可观察对象)在我的模板中与异步管道一起使用。 不幸的是,我收到一个错误:
无法读取 null 的属性“姓氏”
我一直在为这个问题头疼。类似类型的代码可以在对象列表上正常工作(与 *ngFor 一起使用)。
<li>{{(person | async)?.lastname}}</li>
我的服务方法:
getPerson(id: string): Observable<Person> {
let url = this.personsUrl + "/" + id;
return this.http.get(url, {headers: new Headers({'Accept':'application/json'})})
.map(r => r.json())
.catch(this.handleError); //error handler
}
在我的组件中:
//... imports omitted
@Component({
moduleId: module.id,
selector: 'app-details-person',
templateUrl: 'details-person.component.html',
styleUrls: ['details-person.component.css'],
})
export class DetailsPersonComponent implements OnInit, OnDestroy
{
person: Observable<Person>;
sub: Subscription;
constructor(private personService: PersonService, private route: ActivatedRoute) {
}
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
let persId = params['id'];
this.person = this.personService.getPerson(persId);
});
}
ngOnDestroy(): void {
this.sub.unsubscribe();
}
}
显然,可观察对象是/返回管道中的空对象值。 我已经检查了我是否真的从我的服务中获得了一个非空的 Observable,并且我可以确认存在从我的服务返回的(基础)对象。
当然,在从服务中检索 Observable 后,我可以在我的组件中订阅 observable,但我真的很想使用异步构造。
顺便说一句,另一个问题:是否已经有关于如何处理异步管道中发生的错误的模式? (使用异步管道的一个缺点......错误会延迟到视图的渲染时间。
【问题讨论】:
-
这应该可以。请显示返回 observable 的服务代码,以及定义
person的组件代码。或者更好的是,创建一个plunker。 -
嗨,马克,我已经更新了上面的问题部分。您可以阅读上面的服务片段和组件代码。谢谢。