我对Angular很新,现在我只是试图让我的所有路线都按照我的意愿设置和工作。
设置:
当用户导航到某些页面时(此示例为/settings
),应用程序应检查是否有用户已登录。如果有照常继续。否则,用户应该转到登录页面(/login
)。
我想要的是什么:
用户成功登录后,应该转到他们最初尝试访问的页面(/settings
)
我的问题: 是否有“Angular方式”来记住用户试图去的地方?
相关代码:
app.js
.when('/settings', {
templateUrl: '/views/auth/settings.html',
controller: 'SettingsCtrl',
resolve: {
currentUser: function($q, $location, Auth) {
var deferred = $q.defer();
var noUser = function() {
//remember where the user was trying to go
$location.path("/login")
};
Auth.checkLogin(function() {
if (Auth.currentUser()) {
deferred.resolve(Auth.currentUser());
} else {
deferred.reject(noUser());
}
});
return deferred.promise;
}
}
})
login.js
$scope.submit = function() {
if(!$scope.logInForm.$invalid) {
Auth.login($scope.login, $scope.password, $scope.remember_me)
//go to the page the user was trying to get to
}
};
非常感谢约翰·林德奎斯特(John Lindquist)the video让我走到这一步。
答案 0 :(得分:17)
首先,您不希望将用户重定向到登录页面。
单页面网络应用程序中的理想流程如下:
用户访问网站。该网站回复了静态资产 特定路线的角度应用程序(例如/ profile / edit)。
控制器(对于给定路线)使用$ http,$ route或其他机制调用API(例如,通过以下方式预先填写编辑配置文件表单,其中包含登录用户帐户的详细信息) GET到/ api / v1 / users / profile)
如果/当客户端从API收到401时,请显示模式 登录,并重播API调用。
API调用成功(在这种情况下,用户可以查看其帐户的预填充编辑个人资料表单。)
你怎么能做#3?答案是$ http 响应拦截器。
出于全局错误处理,身份验证或任何类型的目的 接收响应的同步或异步预处理,它是 希望能够在之前拦截对http请求的响应 它们被移交给发起这些的应用程序代码 要求。 响应拦截器利用promise apis 满足同步和异步预处理的需要。
http://docs.angularjs.org/api/ng.$http
既然我们知道理想的用户体验应该是什么,我们该怎么做呢?
这里有一个例子:http://witoldsz.github.com/angular-http-auth/
该示例基于以下文章:
http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application
祝你好运,快乐的Angularing!