我正在使用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;错误...
请帮助,它让我发疯了!
提前致谢
答案 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;
}