2016-08-01 46 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