2016-08-01 48 views
1

我有一个从数据库返回数据的服务。 在OnInit我所说的服务,并将它传递的参数和返回的结果:angular 2如何访问模板中返回的json

this._route.params 
    .map(params => params['id']) 
    .subscribe((id) => { 
    this.title = id ? "Edit User" : "New User"; 
    if (!id) { 
     return; 
    } 
    //console.log(id); 
    this._locationService.getLocation(id) 
     .subscribe(
      location => this.location = location, 
      error => alert(error), 
     () => console.log("finished" ) 
     ); 
    }); 

,并在模板中我看到的结果,像这样:

Location - {{location | json}} 

,结果我看到的是: 位置 - [{ “ID”: “1”, “名”: “shliz咖啡”, “地址”: “HEL ST 36,TA”, “LAT”: “32.060143”, “LNG”: “34.770557” }]

所有不错的权利? 很好,当我尝试: {{location.name}}

我得到这个错误:异常:类型错误:为什么我不能访问数据无法读取的不确定

属性“名称”?

我不知道是否以及如何将它连接,但是当我在构造日志this.location我得到了一个未定义而在OnInit我登录this.location我得到的对象。 任何人有任何想法是什么错?

所以只是为了测试,我初始化位置变量,像这样:

location:Location = { 
    name: 'some name', 
    address: 'some addredd', 
    lat: '45.74837', 
    lng: '32.98575' 
}; 

和审判,仍然不能在模板中访问它。所以我评论了调用服务和数据库的oninit部分,然后我可以访问我的初始化值。

但因为的bizzare我登录在完成this.location订阅方法,它是存在的,而且我们知道在模板时,我使用JSON管道将其表现出来。

我迷路

+1

在JSON再看看。为结果设置一个全局变量并在控制台中调用它('window ['test'] = location')或者设置一个断点来检查你设置的实际值。检查控制台中的'typeof test'。你应该明白为什么'location.name'永远不会被定义。另外请查看@micronyks的回答,Angular 2在异步操作返回之前尝试绑定未定义变量的属性时并未保持沉默。使用elvis操作符的 –

回答

2

可以使用Elvis operator (?.)如下图所示,

{{location?.name}} 

错误的原因是,你要显示的数据到达使用async调用视图前。

读一个小的解释。 http://www.syntaxsuccess.com/viewarticle/elvis-operator-in-angular-2.0

+0

只是不显示错误,但没有更改。 如果我登录到订阅: ()=>执行console.log(typeof运算this.location) 我得到:对象 – Ron

+0

这应该肯定的工作。尝试编写'.subscribe((data)=> {this.location = data; console.log(this.location);},错误....);' – micronyks

+0

再次,在控制台中我得到的对象一切正确的里面。但是当模板上有{{location.name}}我得到:XCEPTION:TypeError:无法读取未定义的属性'名称' – Ron