Angular& Firebase列表未更新

时间:2016-08-08 14:59:54

标签: angularjs ionic-framework firebase firebase-realtime-database

我对Angular& amp;火力地堡。我一直在尝试创建一个工厂来更新我的工作站列表,但这个列表似乎还没有更新。 当我在我的控制器中运行工厂代码firebase.database...时,它工作正常。

controller

.controller('DashCtrl', function ($scope,Stations) {

        $scope.stations = [];
        $scope.stations = Stations.getStations();
    })

services

.factory('Stations', function() {
    return {
        getStations : function(){
            firebase.database().ref('stations').once('value',function(snapshot){
                console.log(snapshot.val());
                return snapshot.val();
            })
        }
    }
})

我做错了什么?工厂返回新数据后,ng-repeat="(key,station) in stations"列表是否应该更改?

我也在一些教程中注意到了一些事情。以下2个内容之间有什么区别。

.controller('DashCtrl', function ($scope,Stations) {

        $scope.stations = [];
        $scope.stations = Stations.getStations();
    })

.controller('DashCtrl', [$scope,Stations,function ($scope,Stations) {

        $scope.stations = [];
        $scope.stations = Stations.getStations();
    }])

2 个答案:

答案 0 :(得分:1)

由于你没有用Angular承诺包装firebase结果,角度环境无法注意到有新的结果到达,你有两个解决方案:

  1. 使用Angular Fire为firebase提供角度绑定

  2. 使用$q承诺包装返回结果:

    //controller 
    .controller('DashCtrl', function ($scope,Stations) {
        $scope.stations = [];
        Stations.getStations().then(function(results){
            $scope.stations = results;
        });
     })
    
    //service
    .factory('Stations', function($q) {
        return {
            getStations : function(){
                var defer = $q.defer();
                firebase.database().ref('stations').once('value').then(function(snapshot){
                    defer.resolve(snapshot.val());
                }).catch(function(error){
                    defer.reject(error);
                })
                return defer.promise;
            }
        }
    })
    

答案 1 :(得分:1)

控制器#1

.controller('DashCtrl', function ($scope,Stations) {

    $scope.stations = [];
    $scope.stations = Stations.getStations();
})

控制器#2

.controller('DashCtrl', [$scope,Stations,function ($scope,Stations) {

    $scope.stations = [];
    $scope.stations = Stations.getStations();
}])

控制器#2更适合浏览器完成缩小,结果如下:

controller2.min.js

.controller('DashCtrl', [a,b, function(a,b) {

a.stations = [];
a.stations = b.getStations();
}])