0

Voici le code que j'utilise pour interroger mon firebase à la recherche de joueurs dont ids correspondent aux numéros dans un tableau:mise à jour du résultat d'une fonction en temps réel

.controller('mySquadCtrl', ['$scope','$location','$firebaseArray','$firebaseAuth','CommonProp', 'DatabaseService', 
function($scope,$location,$firebaseArray,$firebaseAuth,CommonProp, databaseService){ 


var uid = CommonProp.userUid(); 
$scope.uid = uid; 
$scope.username = CommonProp.getUser(); 

if(!$scope.username){ 
$location.path('/welcome'); 
} 

databaseService.users.child(uid).once('value', function(usersSnapshot){ 
var users = usersSnapshot.val(); 
var total = users.total; 
var team = users.teamname; 

$scope.pick = total; 

var orderedPlayers = databaseService.players.orderByChild("id"); 
$firebaseArray(orderedPlayers) 
     .$loaded(function(loadedPlayers) { 
     var normalizedPlayers = loadedPlayers.reduce(function(acc, next) { acc[next.id] = next; return acc; }, {}); 
     var selectedPlayers = $scope.pick.map(function(num){ 
      return normalizedPlayers[num]; 
     }); 
     $scope.players = selectedPlayers; 
        $scope.sum = function(items, prop){ 
        return items.reduce(function(a, b){ 
        return a + b[prop]; 
        }, 0); 
        }; 
     $scope.totalPoints = $scope.sum($scope.players, 'goals');  
     $scope.teamname = team; 

}, function(err) { 
    console.log(err); 
    $scope.players = []; 
}); 

}); 


$scope.logout = function(){ 
CommonProp.logoutUser(); 
}; 

}]); 

Si l'utilisateur n'est pas connecté, la page les redirige vers la page d'accueil.

Mon problème est que le résultat $scope.totalPoints ne se met pas à jour en temps réel même si la valeur "objectif" $scope.players le fait lorsque je le modifie directement dans la base de données.

Y at-il un moyen de faire la mise à jour $scope.totalPoints en temps réel que je change les valeurs aux valeurs $scope.players dans la base de données?

Répondre

0

La promesse $loaded est appelée une seule fois: lorsque les données initiales ont été chargées à partir de la base de données. Il n'est pas appelé sur les mises à jour.

Pour avoir une somme de mise à jour automatique, vous souhaitez à la place étendre $firebaseArray. Voir le AngularFire documentation for an example of extending an array to include a total. Pour un autre bon exemple, voir the answer to this question.

+0

Je ne comprends pas comment $ extend fonctionne. Tous les exemples l'utilisent dans une usine. Comme je n'ai pas d'usine dans mon code, cela signifie-t-il que je dois créer une fabrique avant que la fonction $ scope.totalPoints ne se mette à jour? –

+0

Oui. C'est en effet ce que l'exemple fait. –