2016-12-12 70 views
0

我正在使用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視圖中有一個按鈕;當我點擊它時,它會改變頁面,但在頁面切換之前,我會看到名字出現。當我回到我的觀點時,第一名顯示得很好。

我試着換getUserPublicInfo在$範圍。$適用()在我的控制器,但我得到了「$摘要已在進行中」錯誤...

請幫助,它的駕駛我瘋了!

在此先感謝

回答

0

我用$ q來創造一個承諾。通過這樣做最初的火力地堡承諾是角範圍內解決:

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; 
} 
1

要resove, 「$消化正在進行中」 錯誤...把$範圍。超時服務在$ 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(); 
}) 
} 
+0

謝謝韋達您的快速的答案,但我想,以避免以解決$消化錯誤,但避免使用$應用()。你知道爲什麼我的第一段代碼不工作嗎? –

+0

當$ scope在Angular世界以外更新時,$ digest週期不會被觸發。這裏同樣的情況。如果您希望避免使用$ appy(),那麼您必須將值賦給Angular世界中的$ scope.public。 – Ved

+0

正確添加分號'$ timeout(function(){ $ scope。$ apply(); },1);' –