【问题标题】:Read records from firebase based on a previously saved value根据先前保存的值从 firebase 读取记录
【发布时间】:2014-05-19 21:01:09
【问题描述】:

我拿了一个 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;

但我相信我做错了。我尝试在races.$childfb.child 之前添加return,但这并没有解决我的问题。

我尝试硬编码以下json-array,并显示在网页上:

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

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

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

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

【问题讨论】:

  • 部分解决了。 $rootScope 变量参与者InRace 已更新,但当我在另一个浏览器中打开相同页面以获得相同内容时,我必须执行刷新。我相信原因是因为 $rootScope 是在我的 app.factory-controller 中分配的,而不是在 app.module 中。

标签: json angularjs firebase


【解决方案1】:

代码在声明$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') 之前(当数据从服务器返回时),比赛数据将不可用。

【讨论】:

    【解决方案2】:

    感谢您的意见。我现在对 angularjs 和 javascript 有了更多的了解,所以我做了一些重构和清理。硬编码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() 但仍然没有返回数据。所以不是真正的答案。

    问候 克劳斯

    【讨论】:

      【解决方案3】:

      这行得通。我将$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;
        }
      },
      

      【讨论】:

        猜你喜欢
        • 2018-09-10
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 2018-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多