Как отобразить объект 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>