切换状态后 $stateParams 数据为空
$stateParams data null after switching states
我在使用 $stateParams
在有人登录我的应用程序后保存用户信息时遇到问题。我有一些登录代码对 Express 执行 POST,使用护照进行身份验证,身份验证完成后,将用户作为响应的一部分发回,然后转到仪表板状态。
登录码:
User.login = function(user) {
var defer = $q.defer();
$http.post('/login', user)
.success(function(authenticatedUser) {
if(authenticatedUser.redirect && authenticatedUser.username) {
$state.go('app.dashboard.main', {userInformation: authenticatedUser});
var cookie = Cookie.getSessionCookie();
defer.resolve(authenticatedUser);
}
}, function(err, status) {
defer.reject(err);
});
return defer.promise;
};
服务器端(省略密码,它从数据库发回用户对象):
app.post('/login', passport.authenticate('local'), function(req, res, next) {
if(req.user) { //req.user holds the returned session object from the local strategy authentication
console.log('authentication success');
var username = req.user.username;
var firstname = req.user.first_name;
var lastname = req.user.last_name;
var userID = req.user.id;
var user = {
username: username,
firstname: firstname,
lastname: lastname
};
res.cookie('user', user, { httpOnly: false, maxAge: 40000 }); //need to set HTTP only to false in order for client to access server side cookie
res.json({
redirect: true,
username: username,
firstname: firstname,
lastname: lastname
});
}
});
我的仪表板代码:
(function() {
'use strict';
var DashboardCtrl = function($rootScope, $q, $http, User, userInformation, $stateParams) {
this.user = userInformation;
this.logout = User.logout;
};
angular
.module('dashboard', [])
.config(['$stateProvider', function($stateProvider) {
$stateProvider
//child state of 'app'
.state('app.dashboard', {
url: '/dashboard',
abstract: true,
templateUrl: 'modules/dashboard/dashboard-scaffolding.html',
data: {
//will apply to all children of 'dashboard'
requireLogin: true
}
})
.state('app.dashboard.main', {
url: '/main',
params: {'userInformation': null},
resolve: {
userInformation: ['$stateParams', function($stateParams) {
return $stateParams.userInformation;
}]
},
templateUrl: 'modules/dashboard/dashboard-main.html',
controller: 'DashboardCtrl',
controllerAs: 'dashboard'
})
}])
.directive('dashboardBody', function() {
return {
scope: true,
restrict: 'AE',
templateUrl: 'modules/dashboard/directives/dashboard-body-directive.html',
replace: true
}
})
.controller('DashboardCtrl', ['$rootScope', '$q', '$http', 'User', 'userInformation', '$stateParams', DashboardCtrl]);
})();
当我登陆仪表板时,我正在使用此代码,我看到了用户名:
<div class="row">
<div class="col-md-12">
<h1>Welcome, {{dashboard.user.username}}!</h1>
</div>
</div>
我的部分导航 HTML(当我点击个人资料,然后返回主页时,用户名消失):
<nav class="dashboard navbar">
<div class="container">
<div class="row">
<div class="col-md-2">
<div class="project-title">
<p><a ui-sref="app.dashboard.main">Home</a></p>
</div>
</div>
<div class="col-md-10">
<div class="right clearfix">
<div class="logo">
<ul>
<li><a href="" class="btn" ui-sref="app.dashboard.profile">Profile</a></li>
<li><a class="btn" href="/logout">Logout</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</nav>
每次状态改变时 $stateParams
都会得到 'reset' 吗?当我return回到家时,$stateParams
的值是null
。我宁愿在此处存储用户的基本信息,也不愿在每次更改状态时使用服务进行数据库查询。这是存储用户信息的最佳位置吗?我应该总是进行数据库查询来获取它吗?还是存储在session中?这里不确定。
状态参数是 URL 参数。由于您的 URL 中的 none 保留了任何值,因此 $stateParams 的值对您而言始终为空。状态参数通常意味着您需要它们来维护特定 Web 应用程序的状态。
为了更好理解,其实可以参考这个link:
https://github.com/angular-ui/ui-router/wiki/URL-Routing
形成包含有用信息的 url,这些信息可能是导航到特定状态所必需的,例如用户 ID。例如,将 url 更改为类似“/user/:userId”的内容。实际上,它可能会变成类似“/user/235462aed”的东西。现在,状态参数将类似于:
$stateparams={ userId: '235462aed' }
您可以在导航至该州之前解决相同问题。
我在使用 $stateParams
在有人登录我的应用程序后保存用户信息时遇到问题。我有一些登录代码对 Express 执行 POST,使用护照进行身份验证,身份验证完成后,将用户作为响应的一部分发回,然后转到仪表板状态。
登录码:
User.login = function(user) {
var defer = $q.defer();
$http.post('/login', user)
.success(function(authenticatedUser) {
if(authenticatedUser.redirect && authenticatedUser.username) {
$state.go('app.dashboard.main', {userInformation: authenticatedUser});
var cookie = Cookie.getSessionCookie();
defer.resolve(authenticatedUser);
}
}, function(err, status) {
defer.reject(err);
});
return defer.promise;
};
服务器端(省略密码,它从数据库发回用户对象):
app.post('/login', passport.authenticate('local'), function(req, res, next) {
if(req.user) { //req.user holds the returned session object from the local strategy authentication
console.log('authentication success');
var username = req.user.username;
var firstname = req.user.first_name;
var lastname = req.user.last_name;
var userID = req.user.id;
var user = {
username: username,
firstname: firstname,
lastname: lastname
};
res.cookie('user', user, { httpOnly: false, maxAge: 40000 }); //need to set HTTP only to false in order for client to access server side cookie
res.json({
redirect: true,
username: username,
firstname: firstname,
lastname: lastname
});
}
});
我的仪表板代码:
(function() {
'use strict';
var DashboardCtrl = function($rootScope, $q, $http, User, userInformation, $stateParams) {
this.user = userInformation;
this.logout = User.logout;
};
angular
.module('dashboard', [])
.config(['$stateProvider', function($stateProvider) {
$stateProvider
//child state of 'app'
.state('app.dashboard', {
url: '/dashboard',
abstract: true,
templateUrl: 'modules/dashboard/dashboard-scaffolding.html',
data: {
//will apply to all children of 'dashboard'
requireLogin: true
}
})
.state('app.dashboard.main', {
url: '/main',
params: {'userInformation': null},
resolve: {
userInformation: ['$stateParams', function($stateParams) {
return $stateParams.userInformation;
}]
},
templateUrl: 'modules/dashboard/dashboard-main.html',
controller: 'DashboardCtrl',
controllerAs: 'dashboard'
})
}])
.directive('dashboardBody', function() {
return {
scope: true,
restrict: 'AE',
templateUrl: 'modules/dashboard/directives/dashboard-body-directive.html',
replace: true
}
})
.controller('DashboardCtrl', ['$rootScope', '$q', '$http', 'User', 'userInformation', '$stateParams', DashboardCtrl]);
})();
当我登陆仪表板时,我正在使用此代码,我看到了用户名:
<div class="row">
<div class="col-md-12">
<h1>Welcome, {{dashboard.user.username}}!</h1>
</div>
</div>
我的部分导航 HTML(当我点击个人资料,然后返回主页时,用户名消失):
<nav class="dashboard navbar">
<div class="container">
<div class="row">
<div class="col-md-2">
<div class="project-title">
<p><a ui-sref="app.dashboard.main">Home</a></p>
</div>
</div>
<div class="col-md-10">
<div class="right clearfix">
<div class="logo">
<ul>
<li><a href="" class="btn" ui-sref="app.dashboard.profile">Profile</a></li>
<li><a class="btn" href="/logout">Logout</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</nav>
每次状态改变时 $stateParams
都会得到 'reset' 吗?当我return回到家时,$stateParams
的值是null
。我宁愿在此处存储用户的基本信息,也不愿在每次更改状态时使用服务进行数据库查询。这是存储用户信息的最佳位置吗?我应该总是进行数据库查询来获取它吗?还是存储在session中?这里不确定。
状态参数是 URL 参数。由于您的 URL 中的 none 保留了任何值,因此 $stateParams 的值对您而言始终为空。状态参数通常意味着您需要它们来维护特定 Web 应用程序的状态。
为了更好理解,其实可以参考这个link:
https://github.com/angular-ui/ui-router/wiki/URL-Routing
形成包含有用信息的 url,这些信息可能是导航到特定状态所必需的,例如用户 ID。例如,将 url 更改为类似“/user/:userId”的内容。实际上,它可能会变成类似“/user/235462aed”的东西。现在,状态参数将类似于:
$stateparams={ userId: '235462aed' }
您可以在导航至该州之前解决相同问题。