Как отобразить объект json с помощью * ngFor

Я хочу отобразить приведенные ниже данные из 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 Tour of Heroes, например,

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

Значок героя должен показать, например, -KBN9hYI4vYAsyh5k1lX и имя героя должно показать, например, hero 3


Я провел некоторое исследование и наткнулся на это решение stackoverflow от @Thierry Templier ключ доступа и значение объекта, используя * 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>

См. этот вопрос для получения дополнительной информации:

Ответ 2

Вы можете поместить ключи в массив и ng-повторить ключи.

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>

Это выглядит просто для меня.. Дополнительная информация здесь

Ответ 3

Идентификатор Firebase называется $.key. Кроме того, # теперь изменено на let. Это будет работать для вас:

<li *ngFor="let hero of heroes">
  <span class="badge">{{hero.$key}}</span> {{hero.name}}
</li>