我正在尝试弄清楚如何使用AngularFire2将值附加到Firebase对象中的列表。用例是创建一个简单的记分板,通过将以下Score
对象推送到列表,每次更改时保存分数:
{
points: [15, 11],
sets: [2, 1],
timestamp: new Date()
}
数据库中的Scoreboard
对象如下所示:
{
event: 'Volleybal',
home: 'Londen',
away: 'Manchester',
scores: [Score]
}
scores
数组是Score
个对象的数组,如上所述。我需要能够执行两项任务:
Scoreboard
列表以获取正确的事件(假设事件是唯一的)。scores
对象来更新Score
数组。这是正确的架构设计吗?如何使用AngularFire2执行这些任务?
答案 0 :(得分:2)
看起来上面的架构会涵盖您的用例。我建议scores
对象的Scoreboard
属性在代码中处理(并存储)为Object与数组。
假设event
属性对于所有Scoreboard
个对象都是唯一的,您可以使用以下内容从Firebase中检索此属性。
const event = 'Volleyball';
const scoreboards = af.database.list('scoreboards', {
query: {
orderByChild: 'event',
equalTo: 'large'
}
});
但是,如果对象内部有唯一键,则可能值得考虑将该键用于Scoreboard
对象本身,因此Scoreboards资源将如下所示
{
'Volleyball': {
home: 'London',
away: 'Manchester',
scores: {}
},
'Football': {
home: 'London',
away: 'Manchester',
scores: {}
},
...
}
执行此操作将允许您检索/更新此对象,如下所示。
// Get Scoreboard
const event = 'Volleyball';
const scoreboard = af.database.object('scoreboards/' + event);
// Add a new score to the scores property of Scoreboard
af.database.list('/scoreboards/' + event + '/scores').push({
points: [15, 11],
sets: [2, 1],
timestamp: new Date()
});
值得注意的是,Firebase实际上并不存储数组;如果您使用数组呈现Firebase,它会将其转换为对象,其中键是数组的索引。 https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html
根据以下评论编辑回答 要显示最新的存储值,您可以使用以下内容获取值。
const event = 'Volleyball';
const scoreboard = af.database.list('/scoreboards/' + event + '/scores', {
query: {
orderByChild: 'timestamp',
limitToLast: 1
}
});
scoreboard.subscribe(list => {
list.forEach(score => {
// Can access the values of the Score object here
console.log(score.points);
});
});