Angularjs应该从firebase返回的$ rootScope数据?

时间:2013-06-10 14:34:18

标签: angularjs firebase angularjs-scope

假设我要从firebase检索用户信息, 此用户信息将显示在多个路径/控制器

我应该$rootScope返回用户信息吗?

在每个控制器中调用以下代码?

firebaseAuth.firebaseRef.child('/people/' + user.id).on('value', function(snapshot) {
  $scope.user = snapshot.val();
})

更新

我有getUserInfo()函数的以下服务,那么最好的方法是什么 在几个控制器中使用它? 在每个控制器中调用firebaseAuth.getUserInfo().then()? 如果用户数据我必须在几个控制器中使用。我为什么不设置它$rootScope? 所以我不需要在不同的控制器中一次又一次地调用它。

myapp.service('firebaseAuth', ['$rootScope', 'angularFire', function($rootScope, angularFire) {
  this.firebaseRef = new Firebase("https://test.firebaseio.com");
  this.getUserInfo = function(id) {
    var userRef = this.firebaseRef.child('/human/' + id);
    var promise = angularFire(userRef, $rootScope, 'user', {});
    return promise;
  }
});

2 个答案:

答案 0 :(得分:1)

我建议创建一个服务来执行身份验证并存储用户数据。然后,您可以将服务注入需要访问用户的任何控制器。

答案 1 :(得分:1)

AngularFire的目的是让您的javascript数据模型始终与Firebase保持同步。每次需要获取数据时,您都不希望创建新的AngularFire承诺。您只需初始化AngularFire一次,您的本地数据将始终是最新的。

myapp.service('firebaseAuth', ['angularFireCollection', function(angularFireCollection) {
    this.firebaseRef = new Firebase("https://test.firebaseio.com");
    this.initUserInfo = function(id) {
        if (!this.userRef) {
            this.userRef = this.firebaseRef.child('/human/' + id);
            this.userInfo = angularFireCollection(this.userRef);
        }
        else {
            // already initialized
        }
    }
}]);

请记住,服务的所有属性(即使用this关键字指定的所有内容)都可以从注入此服务的控制器访问。因此,您可以执行console.log(firebaseAuth.userInfo)firebaseAuth.userRef.on('value', function(snap) { ... });

等操作

此外,您最终可能希望使用FirebaseAuthClient进行用户身份验证。