網站搜尋

typescript - 如何使用 *ngFor 顯示 json 物件


我想要顯示來自 Firebase 的以下資料

{
   "-KBN9O_qqz-nZ9tPWFdM":{
      "createdAt":1456399292790,
      "isActive":true,
      "name":"Hero 1"
   },
   "-KBN9gjJw1ZlMgt9pVsl":{
      "createdAt":1456399371220,
      "isActive":true,
      "name":"Hero 2"
   },
   "-KBN9hYI4vYAsyh5k1lX":{
      "createdAt":1456399374548,
      "isActive":true,
      "name":"Hero 3"
   }
}

例如在做 angular.io 的英雄之旅教學時

<li *ngFor="#hero of heroes">
  <span class="badge">{{hero.id}}</span> {{hero.name}}
</li>

所以英雄 ID 應該顯示例如 -KBN9hYI4vYAsyh5k1lX,英雄名稱應該顯示例如 英雄 3

我做了一些研究,並遇到了這個由 @Thierry Templier 提出的 stackoverflow 解決方案,使用 *ngFor 訪問對象的鍵和值

(1) 這是我問題的正確解決方案嗎?

(2) 有沒有一個更簡單的方法來解決這個問題,因為我覺得對於使用 Angular2 的開發者來說,顯示這種 JSON 資料會非常常見。

答案#1

你需要實作一個自訂的管道來完成此操作。ngFor 只支援陣列,而不支援物件。

這根管子看起來會像這樣:

@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.push({key: key, value: value[key]});
    }
    return keys;
  }
}

並像那樣使用它:

<span *ngFor="#entry of content | keys">           
  Key: {{entry.key}}, value: {{entry.value}}
</span>

請參見此問題以獲取更多詳情:

  • 使用 *ngFor 訪問對象的鍵和值

答案#2

你可以把鑰匙放入陣列中,然後用 ng-repeat 遍歷這些鑰匙。

export class IterateOverObject {
    public arrayOfKeys;

    @Input heros;
    constructor() {
        this.arrayOfKeys = Object.keys(this.heros);
    }
}

<li *ngFor="#key of arrayOfKeys">
  <span class="badge">{{key}}</span> {{heros[key].name}}
</li>

這對我來說看起來很簡單.. 更多資訊在這裡