我正在为1个管理员构建一个应用程序,以便能够登录和编辑内容。登录后,应用程序将提供私有html doc结构,而不是那些未登录的正常公共文档。我正在使用Angular-route,Session和Passport进行身份验证。我想检查用户是否在他们链接到网站上的另一个页面时登录。因此,如果他们去某个地方他们没有被授权,他们就无法编辑网站上的内容。
当我在本地主机上运行应用程序时,我得到一个$ injector:modulerr。 ReferenceError表示未定义checkAuth。
我尝试使用$ rootScope创建一个全局变量,如建议here:
app.run(['$rootScope', '$http', function($rootScope, $http){
$rootScope.checkAuth = function(){
console.log("rootScope things are happening");
$http.get('/login/loggedin').success(function(user){
if (user !== '0') {
console.log('Authenticated');
return true;
} else {
console.log('Not Authenticated');
return false;
}
});
};
}]);
所以,如果用户登录,我应该得到一个真实的,如果他们没有登录,我会得到一个假的。但是,我仍然得到checkAuth未定义的注入器错误,我从未看到任何控制台日志。
$ rootScope的Angular文档说使用这种格式:
$rootScope.Scope([providers], [instanceCache]);
所以,我试过这个:
$rootScope.Scope(['$rootScope', '$http', function($rootScope, $http){...
不幸的是,这也不起作用。
使用Passport和Angular的This is an example我发现它有点帮助,但它们允许多个用户注册(我不想要)并且它仍然无法解决全局函数的问题用于检查用户是否在网站的多个页面中登录。它可能会帮助您查看类似的控制器和路由文件。
我知道你可以使用工厂和服务来做类似于之前类似问题的建议,但我希望在尝试不同的路径之前先走这条路。显然,如果这是最好的方式,我会试一试。
答案 0 :(得分:1)
提供的rootcope声明对我来说似乎没问题。
指定一个rootscope值。
app.run(function($rootScope) {
$rootScope.checkAuth = function(){
$http.get('/login/loggedin').success(function(user){
if (user !== '0') {
return true;
} else {
return false;
}
})
};
});
使用它(不要忘记$ rootscope依赖)
app.controller('myCtrl', function($scope, $rootScope) {
$scope.authenticated = function() {
return $rootScope.checkAuth ;
};
});
查看实时样本进行比较:http://jsfiddle.net/TmPk5/6/