2016-08-08 61 views
0

我是新角度和角度& Firebase。我一直在試圖建立一個工廠來更新我的電臺列表,但這個列表似乎沒有更新。 當我在我的控制器中運行工廠代碼firebase.database...時,它工作正常。角度和Firebase列表不更新

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"列表是否應該更改?

另外我一直在注意幾個教程中的東西。下面兩個inits有什麼區別?

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

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

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

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

只是爲了清楚的編輯,問題是不與數據庫不返回任何東西,而不是更新返回ng-repeat列表 – LefterisL

回答

1

因爲你沒有用角承諾包裹火力結果,角環境不能看到有新的結果到了,你有兩個解決方案:

  1. 使用Angular Fire其提供的角度綁定對於火力

  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; 
         } 
        } 
    }) 
    
+0

好吧我知道了,但我會用這個,如果我想要使用'once'。 'on'怎麼樣?我怎麼能讓控制器知道從Stations工廠更新列表? – LefterisL

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是通過瀏覽器,這將導致類似更好地爲縮小完成:

控制器2 .min.js

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

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