如何在AngularJS中使用Firebase simpleLogin设置用户

时间:2014-02-12 20:42:40

标签: angularjs firebase angularfire

我在AngularJS中使用了firebase simpleLogin和facebook。 (在自耕农中使用角度和角度火焰发生器生成)

如何正确地将用户保存在变量,$ scope,$ rootScope等中?用户将在另一个角度模块中使用。

代码如下所示:

'use strict';
angular.module('angularfire.login', ['firebase', 'angularfire.firebase'])

  .run(function(simpleLogin) {
    simpleLogin.init();
  })

  .factory('simpleLogin', function($rootScope, $firebaseSimpleLogin, firebaseRef, $timeout) {
    function assertAuth() {
      if( auth === null ) { throw new Error('Must call loginService.init() before using its methods'); }
    }

    var auth = null;
    return {
      init: function() {
        auth = $firebaseSimpleLogin(firebaseRef());
        return auth;
      },

      logout: function() {
        assertAuth();
        auth.$logout();
      },

      /**
       * @param {string} provider
       * @param {Function} [callback]
       * @returns {*}
       */
      login: function(provider, callback) {
        assertAuth();
        auth.$login(provider, {rememberMe: true}).then(function(user) {
          if( callback ) {
            //todo-bug https://github.com/firebase/angularFire/issues/199
            $timeout(function() {
              callback(null, user);
            });
          }
        }, callback);

      }
    };
  });

例如$ rootScope.user = user;工作,但我被告知这不是一个干净的方法。此外,如果我刷新了我已经平静登录,但$ rootscope.user变得未定义。

由于

3 个答案:

答案 0 :(得分:3)

最好的方法是直接将$firebaseSimpeLogin返回的对象分配给$scope

$scope.auth = $firebaseSimpleLogin(firebaseRef());

然后,您可以直接在视图中引用它。例如:

<span ng-show="auth.user">
  {{auth.user.name}} | <a href="#" ng-click="auth.$logout()">Logout</a>
</span>
<a href="#" ng-hide="auth.user" ng-click="auth.$login('facebook')">Login</a>

答案 1 :(得分:0)

想要对Anant的回答问题发表评论,但需要50位代表发表评论:

AngularJS中的$ scope以层次结构排列,模仿DOM,因此它们是可嵌套的。

答案 2 :(得分:0)

问题是,当您重新加载时,经过身份验证的用户在应用程序与FireBase服务器通信之前将无法使用。值得庆幸的是,FireBase会在完成此事件时触发事件,您可以捕获该事件以将您的用户信息推送到$ scope或$ rootScope。

 $rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) {
    var ref = new Firebase(FIREBASE_URL + '/users/' + authUser.uid);
    var user = $firebase(ref).$asObject();

    user.$loaded().then(function() {
      $rootScope.currentUser = user;
    });

    $location.path('/meetings');
  });

我个人在$ rootScope上存储当前用户的信息时没有问题。这不是很多数据,你可能不得不把它送到每个页面的范围内......而这正是$ rootScope的用途。