1

假设我想从 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;
  }
});
4

2 回答 2

1

I would recommend creating a service to perform the authentication and store the user data. Then you can inject the service into any controller that needs access to the user.

于 2013-06-10T14:53:20.060 回答
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进行用户身份验证。

于 2013-06-10T17:42:43.260 回答