更新Firebase上所有子元素的排名

时间:2014-08-14 18:08:12

标签: firebase

我在Firebase上一次更新整个阵列的排名时遇到了问题。

我有以下代码:

var playersList = new Firebase('https://INSTANCE.firebaseio.com/players');

var rank = 1200;
function createNewPlayer(firstname) {
    var newplayer =  new Firebase('https://INSTANCE.firebaseio.com/players/' + firstname);
    newplayer.setWithPriority({first : firstname},rank);
}

我想为setPriority中的每个元素执行playersList

2 个答案:

答案 0 :(得分:0)

更新列表中每个玩家的排名非常容易:

function updatePlayers() {
  playersList.on('child_added', function(snapshot) {
    snapshot.ref().setPriority(snapshot.getPriority()+1);
  });
}

在此代码段中,我只是将值增加1。

Firebase API中没有批量操作。但我怀疑他们会比上面的片段更简单。

http://jsbin.com/pikil/2/edit?js,output

答案 1 :(得分:0)

更简单的解决方案可以是简单地将玩家得分或排名标准存储为优先级。然后你可以获取它们并在它们到达时订购它们。例如,假设我们按points排名:

var myUserId = 'kato';
var ref = new Firebase('https://INSTANCE.firebaseio.com/players/');
function updateMyPoints(newScore) {
   ref.child(myUserId).setPriority(newScore);
}

function fetchAndRankTopPlayers(callback) {
   ref.limit(100).endAt().once('value', function(snap) {
      var players = [];
      snap.forEach(function(ss) {
         players.push({id: ss.name(), score: ss.getPriority()});
      });
   });
}

fetchAndRankTopPlayers(function(list) {
    console.log('the 3rd place player is ' + list[2].id);
});

另外,请查看firebase leaderboard example