2014-04-07 42 views
2

我使用了一个angularjs + firebase示例,并对其中的一个应用程序进行了修改,在该应用程序中,我可以注册一些孩子进行小型越野比赛。根据先前保存的值从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'); 
+0

部分解决。 $ rootScope变量participaInRace已更新,但我必须在另一个浏览器中打开相同页面才能获得相同内容时执行刷新。我相信原因是因为$ rootScope是在我的app.factory控制器中分配的,而不是在app.module中。 – kometen

回答

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')被调用的比赛数据将不可用(当从服务器返回的数据)。

0

感谢您的意见。我现在知道更多关于angularjs和javascript的内容,所以我做了一些重构和清理。硬编码raceId工作:

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

当我把它包在一个呼叫火力点我似乎无法返回所需的数据,可能是因为我对如何返回数据的JavaScript比较有限的知识。示例:

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

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

问候 克劳斯

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; 
    } 
}, 
相关问题