注意$ scope

时间:2017-09-18 10:11:58

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

下面是我用来将我的firebase数据库中的选定玩家带到我的范围的代码:

 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 = [];
});

问题在于,当我从firebase数据库更改目标数量时,总点数不会实时更改。即$scope.players = selectedPlayers;实时更新,但刷新页面后$scope.totalPoints only更新。

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

2 个答案:

答案 0 :(得分:0)

为什么不直接在回调中将其设置为

values = []
for i in range(1,5):
    values.append(row[i].text.replace('\xa0', ' ').split(' ')[0])

ozone, no2, so2, pm10 = values
return {'ozone': ozone, 'no2': no2, 'so2': so2, 'pm10': pm10}   

而不是

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

这会将结果直接绑定到范围变量

答案 1 :(得分:0)

假设

  • Angular 1.x.x
  • $scope.totalPoints是一个数字(原始)

可能是$scope.totalPoints正由子范围(可能是嵌套指令或控制器)使用,这就是为什么更改没有传播给它们。尝试将totalPoints包裹在内部和对象中。

$scope.state = {
  totalPoints: 0
};

在模板和firebase回调中进行必要的更改。

如果这不起作用,请尝试使用

手动请求摘要周期
$scope.$apply(function () {
  $scope.totalPoints = $scope.sum($scope.players, 'goals'); 
})