根据以前保存的值从firebase读取记录

时间:2014-04-07 14:34:32

标签: json angularjs firebase

我采用了angularjs + firebase示例并将其修改为一个应用程序,我可以为一个小型越野比赛注册一些孩子。

我可以使用基本结构注册孩子(参与者),比赛,地点,俱乐部等:

FIREBASE_URL/races
FIREBASE_URL/clubs

等等。选择活动竞赛后,我保存raceId并竞赛json-object,并可以将参与者添加到活动竞赛中。

示例:

FIREBASE_URL/active_race/-JI6H9VQewd444na_CQY
FIREBASE_URL/active_race/json-object

我想做的是根据raceId获取所有参与者(如果有的话):

FIREBASE_URL/races/-JI6H9VQewd444na_CQY/participants

我尝试了以下

'use strict';

app.factory('Race', function ($firebase, FIREBASE_URL, User) {
  var ref = new Firebase(FIREBASE_URL + 'races');
  var races = $firebase(ref);
  var Race = {
    all: races,
    getParticipantsInRace: function () {
      var fb = new Firebase(FIREBASE_URL);
      fb.child('active_race/raceId').once('value', function (activeSnap) {
        races.$child('/' + activeSnap.val() + '/participants');
      });
    }
  };

return Race;

但我相信我做错了。我试图在returnraces.$child之前添加fb.child,但这并没有解决我的问题。

我尝试对以下json-array进行硬编码,这将显示在网页上:

return [{name: 'Claus', born: '1967'}, {name: 'John', born: '1968'}];

如何让所有参与者进入$scope.participantsInRace

我相信我有一个解决方案,但我不确定这样做是否明智。但它可能就这么简单。预先$rootScope.participantsInRace =将它放入rootScope:

$rootScope.participantsInRace = races.$child('/' + activeSnap.val() + '/participants');

3 个答案:

答案 0 :(得分:0)

代码在声明$firebase(URL+'races');时已经在同步所有种族中的所有数据。此外,您从未将races.$child(...)分配给任何内容,因此以后无法引用该数据。

app.factory('Race', function ($firebase, FIREBASE_URL, User) {
  var ref = new Firebase(FIREBASE_URL + 'races');
  var races = $firebase(ref);
  var Race = {
    all: races,
    getParticipantsInRace: function (raceId) {
      return races[raceId]? races[raceId].participants || {};
    }
  };
  return Race;
});

请记住,在调用races.$on('loaded')之前(当数据从服务器返回时),竞赛数据将无法使用。

答案 1 :(得分:0)

感谢您的输入。我现在对angularjs和javascript了解得更多,所以我做了一些重构和清理工作。 Hardcoding raceId有效:

getParticipantsInRace: function () {
  return races.$child('-JIecmbdDa4kUT2L51iS').$child('participants');
}

当我将它包装在对Firebase的调用中时,我似乎无法返回所需的数据,这可能是由于我对如何返回数据的javascript知识有限。例如:

getParticipantsInRace: function () {
  ref.child('activeRace').child('raceId').once('value', function (activeSnap) {
    return races.$child(activeSnap.val()).$child('participants');
  });
}

我的想法是获得raceId然后返回所有参与者。我试图在返回ref.child()前添加,但仍然没有返回数据。所以不是一个真正的答案。

此致 克劳斯

答案 2 :(得分:0)

这很有效。我将$rootScope.participantsInRace更改为$scope.participantsInRace以及以下内容:

getParticipantsInRace: function () {
  if (User.signedIn()) {
    var t = [];
    var user = User.getCurrent();
    var fb = new Firebase(FIREBASE_URL + 'users');
    fb.child(user.username).child('activeRace/raceId').once('value', function (userSnap) {
      t = races.$child(userSnap.val()).$child('participants');
    });
    return t;
  }
},