在Firebase承诺中更新$ scope后,视图不会刷新

时间:2016-12-12 11:10:26

标签: angularjs ionic-framework angularjs-scope promise

我正在使用Ionic Framework,Firebase是我的BaaS。

控制器:

.controller('ProfileCtrl', function($scope, AuthService, DatabaseService) {
 console.info('** ProfileCtrl **');
 var user = firebase.auth().currentUser;
 $scope.public = {};

 DatabaseService.getUserPublicInfo(user.uid)
 .then(function(infoSnap) {
   infoSnap.forEach(function(item) {
     $scope.public[item.key] = item.val();
   });
 });
})

服务:

.service('DatabaseService', function($q) {
  this.getUserPublicInfo = function(uid) {
   return firebase.database().ref('/users/'+uid+'/public/').once('value');
  }
}

在我的HTML视图中,我有以下内容:

<div><h3>{{public.firstname}} {{public.lastname}}</h3></div>

没有错误,在调试时,$ scope.public.firstname作为正确的值,但没有显示任何内容。 我的HTML视图中有一个按钮;当我点击它时,它会改变页面,但在页面切换之前,我看到第一个名字出现了。当我回到我的视图时,第一个名字就会很好地显示出来。

我尝试在$ scope中包含getUserPublicInfo。$ apply()在我的控制器中,但我得到了正在进行的&#34; $摘要&#34;错误...

请帮助,它让我发疯了!

提前致谢

2 个答案:

答案 0 :(得分:1)

要恢复,&#34; $ digest已在进行中&#34;错误...将$ scope。$ appy置于超时服务中。

DatabaseService.getUserPublicInfo(user.uid)
 .then(function(infoSnap) {
   infoSnap.forEach(function(item) {
     $scope.public[item.key] = item.val();
    $timeout(function(){
        $scope.$apply()
},1)
   });
 });

编辑1:尝试此操作以避免使用$scope.$apply()。我还没有测试过它。但它应该有用。

DatabaseService.getUserPublicInfo(user.uid)
     .then(function(infoSnap) {
   $scope.updatePublic(infoSnap)
       });
     });


$scope.updatePublic = function (infoSnap) {
    infoSnap.forEach(function(item) {
         $scope.public[item.key] = item.val();
 })
}

答案 1 :(得分:0)

我使用$ q来创建一个承诺。通过在Angular范围内解决初始Firebase承诺:

this.getUserPublicInfo = function(uid) {
  console.info('getUserPublicInfo - get user public information for uid: '+uid);
var deferred = $q.defer();

  firebase.database().ref('/users/'+uid+'/public/').once('value')
  .then(function(snap) {
    deferred.resolve(snap);
  })
  .catch(function(error) {
    deferred.reject(error);
  });

  return deferred.promise;
}