我在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变得未定义。
由于
答案 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的用途。