Ald*_*tev 14 angularjs angularjs-routing
我想检查一个http服务,看看用户是否经过身份验证,以及是否有权在AngularJS 1.2.0rc1中查看某个页面(控制器).
我有这种情况:用户A想要访问http://www.example.com/content.现在,当他或她未经过身份验证时,无法访问此内容.如果用户未经过身份验证,则应将其重定向到http://www.example.com/login.
现在我设法做到了这一点,但我简要地看到了内容页面的渲染html.我不想要这个.如何在不呈现内容页面的情况下重定向到登录页面?
我这样注册我的路线:
$routeProvider.when('/login', route.resolve('Login', false))
$routeProvider.when('/content', route.resolve('Content', true))
Run Code Online (Sandbox Code Playgroud)
现在我试过这个:
$rootScope.$on('$routeChangeStart', function (event, route) {
if (route.requiresLogin) {
$http.get('/api/user/loggedin/').then(function (response) {
if (response !== 'true') {
$location.path('/login');
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
哪个有效,但我仍然看到其他页面(内容)的html内容闪烁.
我在这里读到,您还可以尝试在解析路由时更改解析功能:
var resolve = function (baseName, requiresLogin) {
var routeDef = {};
var dependencies = [routeConfig.getControllersDirectory() + baseName + 'Controller.js'];
routeDef.templateUrl = routeConfig.getViewsDirectory() + baseName.toLowerCase() + '.html';
routeDef.controller = baseName + 'Controller';
routeDef.requiresLogin = requiresLogin;
routeDef.resolve = {
load: ['$q', '$rootScope', '$http', '$location', function ($q, $rootScope, $http, $location) {
console.log(requiresLogin);
if (requiresLogin) {
return checkLoggedIn($q, $rootScope, $http, $location);
} else {
return resolveDependencies($q, $rootScope, dependencies);
}
}]
};
return routeDef;
}
Run Code Online (Sandbox Code Playgroud)
但这里的页面也会简要显示.
希望你能帮助我.
Ade*_*Ade 22
第一个答案应该有效,但要使用$ q我会使用defer.resolve()或者defer.reject("rejection_reason")然后我会$routeChangeError在顶层控制器中监听,该控制器绑定到routeProvider管理的ng-view之外的元素.
所以在你的HTML中,类似于:
<body ng-app="app" ng-controller="DocumentCtrl">
<div ng-view>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
然后你的那条路线将被定义为:
when('/home', {
templateUrl: templateUrl blah,
controller: baseName + 'Controller',
resolve: {
load: function($q, MY_USER_SERVICE){
var defer = $q.defer();
if(~MY USER LOGGED_IN LOGIC RETURNS TRUE~){
defer.resolve();
} else {
defer.reject("not_logged_in");
}
return defer.promise;
}
}
}).
Run Code Online (Sandbox Code Playgroud)
然后我的DocumentCtrl控制器将包含:
$scope.$on("$routeChangeError", function(evt,current,previous,rejection){
if(rejection == "not_logged_in"){
//DO SOMETHING
} else {
//OR DO SOMETHING ELSE
}
});
Run Code Online (Sandbox Code Playgroud)
我正在运行上面的内容,并且没有任何不应加载的视图的闪存.
| 归档时间: |
|
| 查看次数: |
15692 次 |
| 最近记录: |