我想把angularFireAuth放在服务中。
app.factory('authService',
function($rootScope, $timeout, angularFireAuth, FIREBASE_URL) {
return function() {
angularFireAuth.initialize(new Firebase(FIREBASE_URL), {
scope: $rootScope,
name: 'user',
path: "/"
});
$rootScope.$on('angularFireAuth:login', function _set(evt, user) {
$timeout(function() {
$rootScope.auth = {
authenticated: true
};
});
});
$rootScope.$on('angularFireAuth:logout', function(){
$timeout(function() {
$rootScope.auth = {
authenticated: false
};
});
});
}
});
然后我在.run()
中初始化它.run(['$rootScope', 'authService', function($rootScope, authService){
authService();
});
我的问题是如何在其他服务和控制器中使用$scope.auth.authenticated
。
我在控制器中console.log($scope.auth.authenticated)
。它总是返回假。好像它没有收听/观看登录
或者
我可以直接在控制器中使用$ scope.user并监听吗?
更新
我创建了一个plunker。
答案 0 :(得分:2)
问题是$ scope.user(以及扩展名$ scope.auth)在登录发生之前不会创建,直到单击登录按钮。但是一旦创建控制器(onDOMReady)就会发生console.log事件。
您可能根本不需要$ scope.auth。 Firereader正在使用它,因为它需要一些额外的数据放入用户对象,特别是在ng-switch语句中使用的布尔值。在您的情况下,您可以使用$ scope.user,它由angularFireAuth设置,而不是使用$ scope.auth对象。
因此,总而言之,如果您将console.log移动到等待登录完成,它将按预期工作:http://plnkr.co/edit/Bd23DGFtEpqO2g4jo06v?p=preview
var app = angular.module('plunker', ['firebase']);
app.constant('FIREBASE_URL', 'https://newname.firebaseio.com/');
app.run(['$rootScope', 'authService', function($rootScope, authService){
authService();
$rootScope.$watch('auth.authenticated', function() {
isAuthenticated = $rootScope.auth.authenticated;
});
}]);
app.factory('authService', [
'$rootScope',
'$timeout',
'angularFireAuth',
'FIREBASE_URL',
function($rootScope, $timeout, angularFireAuth, FIREBASE_URL) {
return function() {
angularFireAuth.initialize(new Firebase(FIREBASE_URL), {
scope: $rootScope,
name: 'user'
});
$rootScope.$on('angularFireAuth:login', _log);
function _log(evt, user) {
// this is where $scope.user and $scope.auth will be set
console.log($scope.user);
}
}
}
]);
app.controller('MainCtrl', function($scope, authService, angularFireAuth) {
$scope.name = 'World';
$scope.login = function(){
angularFireAuth.login('facebook');
}
$scope.logout = function(){
angularFireAuth.logout();
}
// angularFireAuth hasn't returned yet at this point
// console.log($scope.auth);
});
答案 1 :(得分:1)
感谢Tom Chen的第二个例子,我正在使用angularfire的auth:
myapp.controller("UserController", ["$scope", "$firebase", "$firebaseSimpleLogin", function($scope, $firebase, $firebaseSimpleLogin) {
var ref = new Firebase("https://XXXXXX.firebaseio.com/");
$scope.auth = $firebaseSimpleLogin(ref);
$scope.$watch('auth', function(newAuth, oldAuth){
console.log(newAuth, oldAuth);
// logged in,
// can reference newAuth.user.id
}, true);
}]);
更新
此示例也是回调
$scope.$on("$firebaseSimpleLogin:login", function(e, user) {
// can reference user.id
});
答案 2 :(得分:0)
我可以想到为什么这不起作用的一个原因可能是本地范围正在影响$ rootScope上声明的变量。可能已经对本地范围对象auth
进行了分配。您可以通过放置一些断点并验证$rootScope.auth
和$scope.auth
的值来在firebug或chrome工具中验证这一点。
最好检查auth在子范围内何时完成。
答案 3 :(得分:0)
我会将angularFire
替换为angular-on-fire
并使用提供的fireEntry
服务。
module('app.auth', ['angular-on-fire'])
.constant({FirebaseUrl: "https://YOUR_FB_NAME.firebaseIO.com/"})
.run(['$rootScope', 'fireEntry', function($rootScope, fireEntry){
var auth = {};
$rootScope.auth = auth;
fireEntry(auth);
}]]);
因此,对auth
的任何更新都会反映在$rootScope
身份验证变量中
如果用户已登录,auth
将包含FirebaseSimpleLogin提供的用户信息。注销后,auth
将为空。
您现在可以在$rootScope.auth
上观看以接收任何身份验证更新!
module('app.ctrl', ['app.auth']).controller('HomeCtrl', ['$scope', function($scope){
$scope.$watch('auth', function(newAuth, oldAuth){
console.log(newAuth, oldAuth);
}, true);
}]);