2014-04-07 37 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; 
    } 
}, 
相關問題