AngularFire2を使用して、Firebase Database(リアルタイム)からデータを取得します。
私がやった事:
{「クラス」:{「学生」:{「トム」:「男性」、「メアリー」:「女性」、「ピーター」:「男性」、「ローラ」:「女性」}、「numberOfStudent」:10} }
app.component.ts
import { AngularFireDatabase } from 'angularfire2/database';
import { Observable } from 'rxjs/Observable';
...
export class AppComponent {
class: Observable<any>;
students: Observable<any[]>;
constructor(private db: AngularFireDatabase) {
this.class = db.object(‘class’).valueChanges();
this.students = db.list(‘class/student’).snapshotChanges();
}
}
app.component.html:
<h2>Class size: {{ (class | async)?.numberOfStudent }}</h2>
<ul>
<li *ngFor="let i of students | async">
{{i.key}} : {{i.value}}
</li>
</ul>
どうした:
クラスサイズ:10
トム:
メアリー:
ピーター:
ローラ :
Listの値を返しません。
どんな提案も大歓迎です。
[〜#〜] upd [〜#〜]
新しいAngular 6およびRxJS 6を使用すると、次のようになります。
import { map } from 'rxjs/operators';
// ...
return this.fb.list(`/path/to/list`)
.snapshotChanges()
.pipe(map(items => { . // <== new way of chaining
return items.map(a => {
const data = a.payload.val();
const key = a.payload.key;
return {key, data}; // or {key, ...data} in case data is Obj
});
}));
AngularFire2ライブラリは、@ rickdroioの回答以降、いくつかの重大な変更を経ています。以下は、ソリューションの更新バージョンです。
afs.collection<Shirt>('class/student').snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.val();
const id = a.payload.id;
return { id, ...data };
});
});
リストのキーと値を取得できました。以下のヒントに従ってください。
<li *ngFor="let i of seats | async">
{{i.key}} : {{i.payload.val()}}
</li>
それは私のために働いたが、私はまだより多くのベストプラクティスを受け取るために開いています
あなたの問題はJSONオブジェクトの学生が配列ではなく、それをループしようとしていることです。
"student" : { “Tom” : “male”, “Mary” : “female”, “Peter” : “male”, “Laura” :
“female” }, "numberOfStudent” : 10 }
生徒をループさせるには、生徒をリストまたはオブジェクトにする必要があります。
"student" :
[ { "name" : "Tom", "sex" : male}, {"name" : "Mary, "sex" : "female" }, ... ]
let i of student | async
をループし、名前と性別にアクセスi?.name
、i?.sex
Angular 6で
壊す:
今後のクエリのためにキー/値を保存するマップを作成しました。
値を取得し、以前に作成したマップに追加しました
todosKeyValues: Map<string, Todo> = new Map();
constructor(private databaseFB: AngularFireDatabase) {
this.fetchKeyValues();
}
private fetchKeyValues() {
this.databaseFB.list('/').snapshotChanges().subscribe(actions => {
actions.forEach(action => {
const value = action.payload.val();
const id = action.payload.key;
this.todosKeyValues.set(id, value);
});
});
}
private getKey(id: number): string {
const foundEntry = Array.from(this.todosKeyValues.entries())
.filter(entry =>entry[1].id === id).pop();
return foundEntry ? foundEntry[0] : undefined;
}
private getTodo(id: number): Todo {
const foundEntry = Array.from(this.todosKeyValues.entries())
.filter(entry => entry[1].id === id).pop();
//index 0 is the key, index 1 is the value
return foundEntry ? foundEntry[1] : undefined;
}
...