目前我有一个授权系统,可以使用angularfire跟踪用户登录/注销状态。我正在查看的指南建议在每个控制器中使用$ onAuthStateChanged。
$rootScope.authObj.$onAuthStateChanged(function(firebaseUser) {
if (firebaseUser) {
console.log("Signed in as:", firebaseUser.uid);
});
} else {
console.log("Signed out");
}
});
相反,我一直在使用$ rootScope.session变量来跟踪我当前登录的用户。这在大多数情况下都很有效,但我无法在其他控制器的开头访问此会话变量,因为该对象未在该点实例化。是否有一种干净的方法来访问控制器范围内的此会话变量,这样我就不必在每个函数中对数据库进行新的引用(因为这些函数在设置了会话变量后调用)
让事情变得更清楚。
ref = firebase.database().ref("users/" + $rootScope.session.id + '/meetings');
list = $firebaseArray(ref);
我的控制器顶部无效,因为$ rootScope.session.id尚未设置。
但是
$scope.addMeeting = function() {
ref = firebase.database().ref("users/" + $rootScope.session.id + '/meetings');
list = $firebaseArray(ref);
list.$add({
name: $scope.meetingname,
date: firebase.database.ServerValue.TIMESTAMP
});
};
在点击按钮时调用的函数是否有效,这将始终在页面已经加载之后,这意味着$ rootScope.session.id由该点设置。
-------------更新-----------------
我已经使用firebases建议的方法让它工作,但它看起来并不漂亮。它涉及将所有内容嵌套在firebase的Auth对象上的侦听器中,然后使用if语句确保用户对象不为null。
myApp.controller('MeetingsController', ['$scope', '$rootScope', '$firebaseAuth', '$firebaseArray', function($scope, $rootScope, $firebaseAuth, $firebaseArray){
var authObj = $firebaseAuth();
authObj.$onAuthStateChanged(function(firebaseUser) {
if (firebaseUser) {
var ref = firebase.database().ref("users/" + firebaseUser.uid + '/meetings');
var meetings = $firebaseArray(ref);
$scope.addMeeting = function() {
meetings.$add({
name: $scope.meetingname,
date: firebase.database.ServerValue.TIMESTAMP
});
};
$scope.deleteMeeting = function(key) {
meetings.$remove(meetings.$getRecord(key)).then(function(ref) {
})
.catch(function(error){
console.log(error);
});
};
}
}); //onAuthStateChange
}]);
答案 0 :(得分:2)
$rootScope
对于此类存储来说是一个糟糕的选择,因为每次刷新页面时都会清理它。
你应该注意its constructor。它附带$localStorage
和$sessionStorage
,请阅读以了解哪种内容更符合您的需求。
然后将ngStorage
添加到您的模块并将$localStorage
注入控制器。
$localstorage.sessionId = id;
这会将ID存储在您的浏览器中。
答案 1 :(得分:2)
angularfire将为您跟踪会话并维护当前用户信息。如果您在每个状态的解析中检查auth,您可以将经过身份验证的用户传递到每个控制器......由于底层的firebase SDK正在为您处理,因此无需本地存储。
提供有关您正在使用的指南的其他信息可能会有所帮助。
此处的文档https://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md#authenticating-with-routers已陈旧,但该模式仍可有效使用
答案 2 :(得分:0)
创建工厂以存储auth属性。这样的事情。
app.factory('authService', function(){
return{
authenticated: false
};
});
然后在控制器中检查它:
$scope.authenticated = authService.authenticated;
希望这能有所帮助
P.S控制器仅用于显示要查看的模型,任何功能都应在单独的指令或服务中移动。您的控制器将来需要清理。