如何等待$ firebaseArray数据

时间:2017-09-16 15:31:00

标签: javascript angularjs firebase web-applications firebase-realtime-database

以下是我的firebase查询,可以正常工作:

var orderedPlayers = databaseService.players.orderByChild("id");

我的意图是将每个玩家的总分加在一起:

            $scope.sum = function(items, prop){
            return items.reduce( function(a, b){
            return a + b[prop];
            }, 0);
            };

            $scope.selectedPlayers = $firebaseArray (orderedPlayers);
            $scope.totalGoals = $scope.sum($scope.players, 'goals');

问题在于,当我直接更改firebase数据库中的目标数量时,我的范围内显示的每个玩家的目标实时更新,但结果总目标数没有相应的变化。

即。 $scope.selectedPlayers updates in real time$scope.totalGoals仅在刷新页面后更新。

是否有可能实时更新后者?

3 个答案:

答案 0 :(得分:1)

您可以使用$scope.$watch检查要更改的值。由于您要在$ scope上查找要更改的值,因此语法如下:

$scope.$watch('players', function (newValue, oldValue) {
    $scope.totalGoals = $scope.sum(newValue, 'goals');
})

在你的情况下不需要它,但如果你想在$ scope上观察一些任意变量而不是某些东西,你可以用一个函数替换'players'字符串,该函数返回你要检查变化的东西:

let something = {
    somethingElse: 'hello world'
};
$scope.$watch(function () {
    return something.somethingElse;
}, function (newValue, oldValue) {});

请注意$ watch语句(无论是第一种样式还是第二种样式)将导致代码在每次调用摘要周期时运行以检查更改,因此拥有大量这些会降低性能。

答案 1 :(得分:1)

我不确定你想看什么,但试试这个:

$scope.$watch('players', (newVal, oldVal)=>{
   $scope.totalGoals = $scope.sum(newVal, 'goals');
});

现在,这将监视$ scope.players中的更改,您可能需要一些其他变量。

答案 2 :(得分:0)

使用随$loaded() method返回的承诺:

$scope.selectedPlayers = $firebaseArray (orderedPlayers);

var qPromise = $scope.selectedPlayers.$loaded();

qPromise.then(function(dataArray) {
    console.log(dataArray);
    $scope.totalGoals = $scope.sum($scope.players, 'goals');
});

重要的是要意识到$firebaseArray方法会立即返回空引用。从服务器返回数据后,将使用实际数据填充现有引用。总和只能在从服务器到达后计算。