var app = angular.module('plunker', ['ui.router']);
app.config(function($stateProvider,$urlRouterProvider){
$stateProvider.state('main',{
templateUrl: 'main.html',
abstract: true,
resolve: {
user: function(User){
console.log('checking authentication')
return User.checkAuthentication();
}
}
});
$stateProvider.state('main.home',{
templateUrl: 'home.html',
url: '/home',
controller: 'HomeController'
});
$stateProvider.state('login',{
templateUrl: 'login.html',
controller: 'LoginController'
});
$urlRouterProvider.otherwise('/home');
});
app.run(function($rootScope,$state){
$rootScope.$on('$stateChangeError',function(ev,toState,toParams,fromState,fromParams,err){
if(err.message === 'NOT_AUTHENTICATED'){
console.log('not authenticated, sending to login')
$state.go('login')
}
})
})
app.controller('HomeController',function(user,$scope){
$scope.user = user;
})
app.controller('LoginController',function(User,$scope,$state){
$scope.login = function(){
User.login().then(function(){
console.log('login success, sending to home')
$state.go('main.home');
})
}
})
app.factory('User',function($http,$q){
var _user = {
isAuthenticated: false
};
function _checkAuthentication(){
if(!_user.isAuthenticated){
throw new Error('NOT_AUTHENTICATED');
}
return $q.when(_user)
}
function _login(){
return $http.get('user.json').then(function(res){
angular.extend(_user,res.data);
return _user;
})
}
return {
checkAuthentication : _checkAuthentication,
login: _login
}
})
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
});
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<script data-require="angular.js@1.2.x" src="https://code.angularjs.org/1.2.27/angular.js" data-semver="1.2.27"></script>
<script data-require="ui-router@*" data-semver="0.2.13" src="//rawgit.com/angular-ui/ui-router/0.2.13/release/angular-ui-router.js"></script>
<script src="app.js"></script>
</head>
<body>
<div ui-view></div>
</body>
</html>
/* Put your css in here */
<h1>login</h1>
<button ng-click="login()">Login</button>
<h1>main</h1>
<div ui-view></div>
{
"username": "joe bob",
"isAuthenticated" : true
}
<h1>home</h1>
{{user}}