私はfirebaseデータベースから取得したデータで更新したいテーブルがあります。 firebase呼び出しが約束を返し、データベース呼び出しが非同期で実行されたことがわかりますが、.thenメソッドでも非同期データをテーブルビューに抽出できないようです。AngluarJSとFirebase、サービスを使用してテーブルを更新する
非同期部分を克服するために、私はサービスを使用しようとしました(この回答Update scope value when service data is changedに基づいています)。テストコールバックメソッドaddValue()
を使用してデータの追加をテストしました。しかし、firebaseクエリの.then()の内部でこのコールバックを使用すると、サービスのデータは更新されますが、ビューでは更新されません。
routerApp.controller('leaderboardCtrl', function($scope, service) {
$scope.data = service.data;
service.getLeaderboard('Test1', 'TestGroup', 10);
//service.getValues();
}).factory("service", function($rootScope, $q)
{
return new (function AsyncTest(){
this.data=[
{name : "Sam" , score : 190}
]
this.getValues=function()
{
var self=this;
//self.data.push({name : "Sam" , score : 180});
self.addValue();
self.count++
},
this.count=0,
this.addValue =function(){
var self=this;
self.data.push({name : "Sam" , score : 180});
}
this.getLeaderboard = function(test, groupName, limit){
var self=this;
var uid = currentUser.uid;
firebase.database().ref('/groupMembers/' + groupName).once('value').then(function(snapshot) {
for(var user in snapshot.val()){
firebase.database().ref('/tests/' +test + '/users/' + user).orderByChild("score").limitToLast(limit).once('value').then(function (snapshot) {
console.log('----LEADERBOARD----');
console.log(snapshot.val());
self.addValue();
console.log(self.data);
});
}
});
}
})();
});
は、「angularFire」を使用することをお勧めします。 firebaseを使用しているすべてのイベントは、データが角度のあるコンテキスト外で取得されているため、ダイジェストを実行するためには、角度を通知する必要があります。 'anglefire'は3ウェイバインディングをとてもシンプルにします – charlietfl
ありがとうございました! –