0

est sous le code que j'utilise pour amener les joueurs sélectionnés de mon firebase databse à mon champ:

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');  


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

Le problème est que lorsque je change le nombre de buts de la base de données firebase , il n'y a pas de changement en temps réel du nombre total de points. c'est-à-dire $scope.players = selectedPlayers; mises à jour en temps réel, mais $scope.totalPoints only mises à jour après l'actualisation de la page.

Est-il possible d'avoir cette dernière mise à jour en temps réel?

+1

Montrez votre * html * Code de modèle. –

+0

Montrez plus de code ou créez un violon pour reproduire votre problème. – lin

+0

Est-ce l'extrait de code que vous avez posté, une partie d'une seule méthode, ou est-ce juste le codeblock complet pour $ onInit() par exemple? Si ce code ci-dessus est dans une méthode, et appelé de quelque part, il peut montrer pourquoi l'erreur se produit (par exemple, $ firebaseArray n'est appelé que lorsque la méthode est appelée). – rrd

Répondre

0

pourquoi pas situé juste dans l'appel directement à être

$scope.players = $scope.pick.map(function(num){ ... 

plutôt que

var selectedPlayers = $scope.pick.map(function(num){ 

cela lie les résultats directement dans la portée des variables

+0

merci mais cela n'a toujours pas fonctionné. Lorsque j'ai changé les objectifs du joueur dans la base de données Firebase, il n'y a pas eu de changement dans la somme totale avant d'avoir actualisé la page. –

0

En supposant

  • A ngular 1.xx
  • $scope.totalPoints est un nombre (primitif)

Il se pourrait que $scope.totalPoints est utilisé par un champ d'enfant (peut-être une directive imbriquée ou contrôleur) et qui est la raison pour laquelle le changement ne se propage pour eux. Essayez d'emballer totalPoints à l'intérieur et objet.

$scope.state = { 
    totalPoints: 0 
}; 

Effectuez les modifications requises dans le modèle et le rappel de la base de données incendie.

Si cela ne fonctionne pas essayer de demander manuellement un cycle condensé en utilisant

$scope.$apply(function() { 
    $scope.totalPoints = $scope.sum($scope.players, 'goals'); 
})