Firebase:使用AngularFire2推送嵌入在对象中的列表

时间:2016-12-30 10:25:44

标签: angular firebase firebase-realtime-database angularfire2

我正在尝试弄清楚如何使用AngularFire2将值附加到Firebase对象中的列表。用例是创建一个简单的记分板,通过将以下Score对象推送到列表,每次更改时保存分数:

{
    points: [15, 11],
    sets: [2, 1],
    timestamp: new Date()
}

数据库中的Scoreboard对象如下所示:

{
    event: 'Volleybal',
    home: 'Londen',
    away: 'Manchester',
    scores: [Score]
}

scores数组是Score个对象的数组,如上所述。我需要能够执行两项任务:

  1. 查询Firebase数据库中的Scoreboard列表以获取正确的事件(假设事件是唯一的)。
  2. 每次分数更改时,通过推送新的scores对象来更新Score数组。
  3. 这是正确的架构设计吗?如何使用AngularFire2执行这些任务?

1 个答案:

答案 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);
   });
});