我想找到登录用户的ID并将其显示在页面中。我是角色的新手,我对如何处理会话没有太多线索..
我有一个角度应用程序,它连接到后端API(.net核心)。
我将展示在网站中使用$ rootScope的实例(已启用登录和授权)。我需要了解这一点才能学习应用程序。
在App.js中:
//Run phase
myApp.run(function($rootScope, $state) {
$rootScope.$state = $state; //Get state info in view
//Should below code be using rootScope or localStorage.. Check which one is better and why.
if (window.sessionStorage["userInfo"]) {
$rootScope.userInfo = JSON.parse(window.sessionStorage["userInfo"]);
}
//Check session and redirect to specific page
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
if(toState && toState.data && toState.data.auth && !window.sessionStorage["userInfo"]){
event.preventDefault();
window.location.href = "#login";
}
if(!toState && !toState.data && !toState.data.auth && window.sessionStorage["userInfo"]){
event.preventDefault();
window.location.href = "#dashboard";
}
});
});
Users.js:
'use strict';
angular.module('users', []);
//Routers
myApp.config(function($stateProvider) {
//Login
$stateProvider.state('login', {
url: "/login",
templateUrl: 'partials/users/login.html',
controller: 'loginController'
});
//Factories
myApp.factory('userServices', ['$http', function($http) {
var factoryDefinitions = {
login: function (loginReq) {
$http.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
return $http.post('http://localhost:1783/api/token?UserName='+loginReq.username+'&password='+loginReq.password).success(function (data) { return data; });
}
}
return factoryDefinitions;
}
]);
//Controllers
myApp.controller('loginController', ['$scope', 'userServices', '$location', '$rootScope', function($scope, userServices, $location, $rootScope) {
$scope.doLogin = function() {
if ($scope.loginForm.$valid) {
userServices.login($scope.login).then(function(result){
$scope.data = result;
if (!result.error) {
window.sessionStorage["userInfo"] = JSON.stringify(result.data);
$rootScope.userInfo = JSON.parse(window.sessionStorage["userInfo"]);
//$localStorage.currentUser = { username: login.username, token: result.data };
//$http.defaults.headers.common.Authorization = 'Token ' + response.token;
$location.path("/dashboard");
}
});
}
};
}]);
我开始知道有关用户的信息将在$ rootScope.userInfo中提供。如果是这样,我如何在其中取值?
如果可能,请举例说明。提前谢谢。
答案 0 :(得分:2)
一:
myApp.controller('loginController', [
'$scope', 'userServices', '$location',
'$rootScope',
function($scope, userServices, $location, $rootScope) {
在控制器内部注入了$rootScope
,这使您可以访问该控制器中的userInfo
。
因此,如果您将$rootScope
注入另一个控制器并console.log($rootScope.userInfo)
,您会看到用户数据。
myApp.controller('anotherController', ['$scope', '$rootScope', function
($scope, $rootScope){
console.log($rootScope.userInfo) //you'd see the users data from sessionStorage
});
根据quora上的这篇文章
$ scope是可从当前组件访问的对象 例如控制器,仅限服务。 $ rootScope引用一个对象 可以从应用程序的任何地方访问。 您可以将$ rootScope视为全局变量,将$ scope视为局部变量。
答案 1 :(得分:1)
在您的情况下,一旦用户登录了密钥" userInfo"在sessionStorage中创建并将相同的数据复制到$ rootScope.userInfo。要在登录后检查userInfo中的字段,请尝试
console.log($rootScope.userInfo);
并在控制台中打印或在浏览器调试工具[打开Chrome开发工具>应用程序> sessionstorage> domainname]中打开会话存储,以查看" userInfo"键。
假设你有
{
uid: "10",
fullname: "John Doe"
}
您可以使用$ rootScope.userInfo.uid或$ rootScope.userInfo [' uid']访问脚本中的uid。
万一你无法阅读代码,这里有一个解释
if (window.sessionStorage["userInfo"]) {
$rootScope.userInfo = JSON.parse(window.sessionStorage["userInfo"]);
}
正在检查用户是否已登录。
工厂
myApp.factory('userServices', ['$http', function($http) {
var factoryDefinitions = {
login: function (loginReq) {
$http.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
return $http.post('http://localhost:1783/api/token?UserName='+loginReq.username+'&password='+loginReq.password).success(function (data) { return data; });
}
}
正在调用服务器来获取userInfo对象。
$scope.doLogin = function() {
if ($scope.loginForm.$valid) {
userServices.login($scope.login).then(function(result){
$scope.data = result;
if (!result.error) {
window.sessionStorage["userInfo"] = JSON.stringify(result.data);
$rootScope.userInfo = JSON.parse(window.sessionStorage["userInfo"]);
//$localStorage.currentUser = { username: login.username, token: result.data };
//$http.defaults.headers.common.Authorization = 'Token ' + response.token;
$location.path("/dashboard");
}
});
}
};
$ scope.doLogin正在调用上面的工厂并存储userInfo对象。