以下是我的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
仅在刷新页面后更新。
是否有可能实时更新后者?
答案 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
方法会立即返回空引用。从服务器返回数据后,将使用实际数据填充现有引用。总和只能在从服务器到达后计算。